Solana上生锈编程的第一印象

2021-06-09 13:23:34

自从尝试在其他几个Rust区块线上进行防锈编程,Aimee和我一直期待着测试驾驶索拉纳。在5月期间,Solana举办了一个Hackathon,这是一个努力尝试的好机会。

在Hackathon期间,我们尝试创建一个“同步Bot”,它会将数据与我们开发的Web app,Travel树上的数据同步到Solana区块链。尽管它具有Web服务器和集中存储后端,该应用程序是用的简单的数据模型旨在兼容块状,使得整个事情可以实现Web服务器。

这个博客很长而蜿蜒,但我试图在这里总结有用的观察。

一般来说,享受了这种经验,它呈现了写作我们想要的代码的乐观障碍。我们对我们写作的代码感到兴奋,期待着写作更多。

docs.solana.com的主要文档是一个良好的入学点甲板索兰人科目,是最新的,并有趣阅读。

Solana程序库是Searchingsolana编程的伟大资源。它包含一堆生产索拉纳代码,但也以一种可以用作学习工具的方式呈现.Smart使用资源。

Solana工具集和自定义工具链轻松安装,不会导致我们任何悲伤。

索拉纳编程模型不会强加典型的智能合同抽象,实施;它只是为您提供了一个低级的输入点,一个缓冲程序,用于解释的程序,以及满满工具的SDK。没有DSL在这里。

虽然当时感到很多问题,但在不和谐中脱掉了很多问题,但回想起来,许多HomeDid都会得到一些答案。我想的一个健康标志。

一般来说,你将重建索拉纳节目库,乐透弄清楚事情是如何工作的。

对于RUSTAN_CLIENTCRATE中看似多种选项的生锈RPC客户端,使用RPCCLIET。这是SPL中使用的类型。我们最初尝试使用瘦客户,但似乎似乎并不是正确的使用类型。

solana_cli_config crate将帮助您读取索拉纳的配置文件的内容。

呼叫solana_logger :: setup_with(" solana = debug");在程序开始之前,或设置envvar rust_log = solana_client = debug。这将在错误时显示LogsFrom您的程序。

当您的程序成功时,日志显示在Solana LogsCommand的输出中。

使用try_from_slice_unchecked从缓冲区浏览,该缓冲区比序列化对象的确切大小为止。当缓冲区不完全正确尺寸时,请尝试_from_slicepanics。

指令预算非常有限 - 我们无法在限制下验证连锁的单个K-256 ECDSA签名,如下所示:

做自己的签名验证程序可能不是使用索拉纳的方式。 Solana Runtime可以验证多个帐户签名,您的程序曾经运行过,所以索拉纳程序似乎需要设计为在需要签名验证时利用这种能力。

索拉纳程序具有预先分配和有界存储大小。这意味着它可能是存储键值MapsDirectly的反模式。似乎是用于键值存储的预期模式,以从单个基本帐户中派生键帐户,并将值存储在这些帐户中。

索拉纳程序可以访问标准库,但它是标准库的一个不相当兼容版本。这是多个混淆的源,包括:

Hashmap似乎只在任何操作都失败了,这表明作为一个神秘的访问违规行为。我们在我们应该刚刚注意到HashMap时花了几个小时寻找我们的错误;和

时间和任何时候都不会对索拉纳的STD建立。无论如何都可以使用STD功能关闭,但随着错误性状的LOSScompatibility。

至少一个函数,read_keypair_file,返回的box< dyn错误>,它不能术语转换为Anyhow ::错误? Rust中的操作员真的需要出错+发送+同步+'静态,除非有很大的原因。

4K BPF堆栈框架意味着一些箱子不起作用,包括ED25519-Dalek.big堆栈帧触发运行时的访问违规。前一时间我曾经遇到过这样的限制。

Cargo Build-BPF在几种情况下的货物构建方式不同,包括缺少-P标志,而不与他们的名字一起使用图书馆。

与以前的经历一样,我们发现了在线Hackathon FormatiNinspiring,大多数没有参加。

它觉得很多关于不和谐的问题就没有了解。这很烦人,也是可以理解的,而不是普通的OPEN源项目。有时没有人介入帮助。就是恰好发生的,但却令人沮丧。

什么是Solana_Client的薄鲸?我们试图使用它,但这似乎是一个错误的选择。

初始化Solana程序状态的最佳模式是什么?我们在我们的帐户日期开始时保留了一个字节,用作“初始化”标志。

我们设法创建了一个能够在区块链上致电的“同步BOT”,并将其集成在区块链中的状态,并在TextReTree.org的服务器上设置,运行针对本地DevNet。

我们确实发现我们关于Codewe类型的一些假设可能会在链中运行错误。特别是我们:

这些都不是索拉纳(Solana)很容易或适当的:签名验证只需要太多的CPU周期;并且程序具有固定的存储空间。

因为它所代表我们的Solana程序没有正确验证它需要的重要性,只接受它的输入是有效的。解决此问题我们需要将我们的应用程序中的加密码重组为我们的应用程序更具特定于索拉纳特定的签名操作。这是一个我们希望保持应用程序逻辑块禁止的应用程序的钻头。

我们也没有探索我们的游戏中的“宝藏”作为NFTS.just耗尽。

今天是17岁。哈克松始于15日,但我们刚刚在移动Airbnbs后立即开始。

我们今天的计划是加入Solana Hackathon Discord渠道,安装Solana SDK,并运行一些Hello World举例。

虽然我们开始了,我们打开了我们错过的视频会话之一,这是一个介绍“索拉纳编程模型”。

程序派生的帐户没有知识的私钥,但仍然可以签署交易(或其他东西)。这听起来像它解决了一个问题,我已经搞定了如何构建分布式应用程序,但我必须进一步调查。

我想安装Solana SDK,工具或我所需要的任何东西。我假设是我需要的SDK的东西。

Hackathon文档包含一些教育链接,我将第一个到索拉纳文档网站。

此页面说“立即开始开发,您可以构建,部署和运行其中一个示例。”这正是我们想要做的。

这种流程有点令人困惑,因为“例子”页面直接从“HelloWorld”,“打破”,这是一个完全不同的例子。虽然说明说要继续向HelloWorld Readme,Aimee Sucumbs对此混乱,并继续尝试遵循“休息”。正确的事情在这里停止,导航到HelloWorld Readme,并继续存在。

这个例子如此良好,记录了,那么README有一个目录。我鼓励这个问题。

此示例需要节点> 1.aimee立即在Mac上遇到问题:她似乎有节点10,尝试用酿造升级,但酿造抱怨,因为她的节点和yarnare不是从酿造的。这一直与她的电脑忘记了她的安装方式节点上次。我们发现她已经安装了NVM并在节点V16.1.0上进行了out.we。

现在,“安装Solana v1.6.6或更高版本”,返回Solana Docs网站的说明。

#版权所有2016生锈项目开发人员。请参阅此分发的顶级目录的版权#文件和#ttp://rust-lang.org/copyright。

#这只是一个小脚本,可以从Internet下载到#安装Solana-Install。它只是平台检测,下载安装程序#并运行它。

这是我写道的Rustup安装脚本的叉子,以及我以前发现的那样,DFINTY也使用。

这不在Rustup-Init.sh脚本中。我在刚刚在整个shell脚本周围抛出一个setof括号之前没有看到这种技术,并怀疑它是多么兼容。

从互联网下载的脚本,并立即通过and解释器立即处理,以防止脚本文件完全下载的问题,因此只有部分地执行。这就是这个支撑的东西。

Rustup-Init.sh尝试通过基本上不是执行的代码来实现这一目标,直到脚本末尾的单一函数调用。所以我稍微复发,有人只是在整个事情上扔了一切,好像说我的原始工作不够。唉,我可以想象一个场景,其中围绕一切技术应该捕获Rustup-init.sh的错误,所以如果我发现自己再次写作shell脚本,那么这就是要考虑的话。我希望我永远不会做。

$ solana config set - url localhostconfig文件:/home/brian/.config/solana/cli/config.ymlrpc url:http:// localhost:8899websocket url:ws:// localhost:8900 /(computed)keypair路径: /home/brian/.config/solana/id.jsonCommitment:确认

我们有一个全局配置文件,对我来说是在xdg标准〜/ .config / solana目录中,

我们有一个账户keypair为我们设置,确切的目的是不明确的,但我认为是一个开发键

下一个指令是创建一个keypair,但索拉纳配置说我已经有一个keypair.i我猜我以前安装了索拉纳sdk,它是一个旧的keypair.i开始生成一个新的keypair.i

$ solana-keygen newgenerating一个新的keypairfor额外的安全性,输入BIP39 PassphraseNote!此密码提高了恢复种子短语的安全性,而不是The TheyPair文件本身,它存储为不安全的纯TextBip39密码(无以为None):

这将是一个开发钥匙,我不关心恢复它。我离开密码短语空白并刚刚点击“进入”。

写了新的凯内特至/home/brian/.config/solana/id.json================================= ================================================= pubkey. :C4NEJZC432PWEDVYR6LIBWCV7WVFDJWDPPLSCL42R3AD =============================================== ==================================保存此种子短语和您的BIP39密码恢复您的新键盘:Engage可能监狱双床控制语言谈话仙人掌爱好车辆允许腮红======================================== ==========================================.

同样,这是一个垃圾dev关键。我很好地打印互联网上的种子短语。

$索拉纳试验validatorLedger位置:测试ledgerLog:测试总账/ validator.logIdentity:GZr7zHFUxA7kjGgzUsUuRfQtNASBCGurynEg7yUDcfvPGenesis哈希:F945qQyeHDUXN58eUWuLHLogAZ7Qgkpucc7xe8LisQnRVersion:1.6.9Shred版本:54687Gossip地址:127.0.0.1:1025TPU地址:127.0.0.1:1027JSON RPC的URL:http: //127.0.0.1:8899�00:00:08 |加工插槽:16 |确认插槽:16 |最终插槽:0 | Snapshot插槽: - |交易

我喜欢到目前为止我看到的一切:Doc已经指导了我,这款工具已经干净了。

在阅读索拉纳的使用BPF之后,我在他们不和谐的问题中,我一直在想几个星期:

Solana的人可以提醒我为什么索拉纳用BPF作为其指令集?我以为是因为BPF没有完成完整,并且可以核实计划终止,但我最近被告知就没有这种情况

Solana从目标eBPF获得了哪些优势,与其VM为任何其他指令集?一段时间一直试图为此答案。

有人通过ping“chase ||索拉纳“,并要求他们问一个索拉纳开发来解释,但解释永远不会来。

有关Solana的JIT编译器的任何博客或基准是否可以退房?

经过一些基于淋浴的反光,虽然虽然在遥远的过去中慢慢地慢跑了内存。我现在回想起了BPF指令集的设计很容易翻译为x86.所以它可能是简单的杂交和性能是选择BPF的原因。

有趣的是,我相信这也是神经功能RISC-V-its简单寄存器的一部分的一部分,并且指令集很容易映射到x86。

现在是5/19。 HelloWorld教程中的下一步是构建和运行应用程序。构建由NPM驱动,但也包括货物组件。

:〜/ solana / example-helloworld $ npm installnpm warn ebadengine不支持引擎{npm warn ebadengine包:' [email protected]',npm warn ebadengine所必需:{node:' 12.x' 12.x&# 39; },NPM Warn Ebadengine电流:{node:' v15.10.0',npm:' 7.5.3' NPM Warn Ebadengine}

这里有一个问题:我有节点v15,build给我一个警告,这是必需的,但是这个演示的自述文件说“v14推荐”。所谓的包应该更新,以后应该更新包裹版本或文档应该说“V12推荐”。

作为其中的一部分,Build运行Cargo Build-BPF.I我猜测Bubl-BPF子命令已经安装了NPM安装,这是一个货物构建。 Cargo Build-BPF下载Solana BPF SDK:

签名:...交易在2006年执行插槽状态2jP1sCQ2CVzizHzc7zgajwf2E8yU2x4RhSyeL59mvFio8UvkyS4rcxyVaNyan5w7UCm3cZBsYefoETBD7DuZbbBt:好的日志消息:计划11111111111111111111111111111111调用[1]程序11111111111111111111111111111111成功计划11111111111111111111111111111111调用[2]程序11111111111111111111111111111111成功部署的程序2jW9jdWSwqkM2rznH5MwL65obzMoHUHZsxpUmjAULsmq

$ npm运行开始> [email protected]开始> TS-Node SRC / Client / Main.TsNode:内部/模块/ CJS / Loader:926抛出Err; ^错误:找不到模块' arg'需要堆栈: - /home/brian/solana/example-helloworld/node_modules/ts-node/dist/bin.js在function.module._resolvefilename(节点:内部/模块/ CJS / LOADER:923:15)AT函数.module._load(node:modules / cjs / loader:768:27)在module.require处(节点:内部/模块/ cjs / loader:995:19 )根据要求(节点:内部/模块/ cjs / exervers:92:18)。<匿名和gt; (/home/brian/solana/example-helloworld/node_modules/ts-node/dist/bin.js:8:13)在module._compile(节点:内部/模块/ cjs / loader:1091:14)在对象。 module._extensions..s(节点:内部/模块/ cjs / loader:1120:10)在module.load(node:modules / cjs / loader:971:32)函数.module._load(neget:内部/ modules / cjs / loader:812:14)在函数.executeuserentrypoint [作为runmain](节点:内部/模块/ run_main:76:12){code:' module_not_found&#39 ;, quandestack:[&#39 ; /home/brian/solana/example-helloworld/node_modules/ts-node/dist/bin.js' } npm错误!代码1NPM ERR!路径/主页/ Brian / solana / emaly-helloWorldnpm err!命令Failednpm错误!命令sh -c ts-node src / client / main.tsnpm err!可以找到完整的此运行日志:NPM ERR! /home/brian/.npm/_logs/2021-05-19t01_48_31_041z-debug.log.

我谷歌“找不到模块arg”.nothing.i运行git pull以检查bugfixes.nothing.i看到我在树中有一些脏文件。所以我决定从git重置开始,运行git重置--hard orign / master && RM node_modules&& rm dist。

我经过NPM Install / NPM Run Build:程序 - Rust / Solana程序Deploy / NPM再次运行StareSequence。

$ npm运行开始> [email protected]开始> ts-node src / client / main.tslet' s向索拉纳账户发出你好...与群集的连接建立:http:// localhost:8899 {'功能集&#39 ;: 2960423209,& #39; solana-core&#39 ;:' 1.6.9' }使用含499999998.27048796 SOL支付feesUsing程序7NMkTRVNtBvuC68BVeamnXmuqcpiVeLQgNDGzQrPceTNCreating帐户C4NEJZc432PWEDvYR6LiBWCv7wvfdJWDppLscL42R3aD帐户6GeXM3KjbPJ7pXQoDri2f2YPzZXGts2ewHiVRFGuaZWt打招呼toSaying招呼6GeXM3KjbPJ7pXQoDri2f2YPzZXGts2ewHiVRFGuaZWt6GeXM3KjbPJ7pXQoDri2f2YPzZXGts2ewHiVRFGuaZWt已经迎来1时间(s)成功

好的。我永远不会知道我做错了什么。当它发生时,但这就是黑客攻击。

铁锈合同很好,短缺。整件事是减去进口和测试:

//声明并导出程序' s ententpoint entintpoint! (process_instruction); //程序输入点' s实现pub fn process_instruction(program_id:& pubkey,//帐户的公钥,Hello World Program的帐户被加载到账户中:& [AccountInfo],//表示Hello至_指令_Data:& [U8],//忽略,所有HelloWorld指令都是Hellos) - > programSresult {msg! ("你好世界生锈程序入口"); //迭代账户更安全,然后索引让帐户_Ters_Ter =& mut帐户.Ter(); //获取帐户来说招呼才能让帐户= next_account_info(contains_iter)? ; //该帐户必须由程序拥有,以便在帐户中修改其数据.OWNER!= program_id {msg! ("问候帐户没有正确的程序ID"); returner err(programError ::不正确); } //递增和存储帐户已被打招呼的次数让mut greeting_account = greetingAccount :: try_from_slice(&帐户.data .borry .borry .borent())? ; greeting_account .counter + = 1;问候语_Account .serialize(& mut& mut帐户.data .borrow_mut()[..])? ; msg! ("问候{}时间!",reduging_account .counter);好的 (()) }

我很喜欢这个:这里有很少的魔法 - 你定义了一个入口点,你得到了一个斑点的指令数据,它取决于你使用SDK解释它。

#[宏_export] macro_rules! entrypoint {($ process_instruction:ident)=> {///#安全#[no_mangle] pub不安全extern" c" FN入口点(输入:* mut U8) - > U64 {让(program_id,帐户,指令_data)=不安全{$ crate ::cestpoint :: deserialize(输入)};匹配$ process_instruction(& program_id,&帐户,& nighard_data){ok(())=> $ crate ::cestpoint ::成功,错误(错误)=>错误.into(),}} $ crate :: custom_heap_default! (); $ crate :: custom_panic_default! (); }; }

就个人而言,我喜欢了解引擎盖下发生了什么,并且在合理的宏观中不喜欢隐藏的魔法,所以我鼓励这个。

我们花了一段时间通过GitHub上的Rust和Cypersctific源代码进行阅读,但我并没有概述我们这里的想法。

在“了解Readmelink的”了解“的代码中的所有链接,对旧的提交,并且有点令人困惑。

我还发现NPM安装过程的一部分运行Cargo更新,它离开了我的LockFile Dirty.i提交PR以更新LockFile。

既然我们有工具,以及如何建立索拉纳计划和客户的基本了解,让我们考虑将索拉纳集成到我们自己的项目中。

该项目被称为宝库,它是一个真正的宝藏狩猎,宝藏是NFTS.IN,

宝藏官器发现并扫描这些QR代码,以便在网络上索取它们,如NFTS。

因此,我们的应用程序,工厂和索赔中只有两个动词,并执行oinvolves创建和验证几个加密签名。

我们已经将应用程序原型为使用火箭的传统WebApp。此Hackathon的目标是在索拉纳计划中实施两种动词,工厂和索赔;使宝藏可转入NFTS;并创建一个同步状态的服务将这些宝藏从集中服务中的集体服务放在区块链上。

注意

......