对于EOS RAM的来讲什么最重要呢?咱们常常在天天的数字货币和区块链相关新闻中看到EOS旁边的RAM
这个词,可是不管如何咱们应该关注它的价格,为何要关注它的价格,即便是那些只想深刻了解智能合约开发的人也须要这样吗?Eos中基本上有三种类型的资源:带宽(Network),计算和计算积压(CPU)和状态存储(RAM)。RAM本质上是为智能合约中调用的每一个交易提供资源的gas,不像磁盘和CPU是经过token值按比例得到的资源,RAM是须要从eosio购买的。RAM的价格由Bancor
算法预先肯定。Bancor算法将动态地促进当前RAM的供应和供应的价格基础并使其达到市场均衡。所以,全部买卖ram的交易都是与eosio.ram的单方面交易。次级市场也激励那些没有使用它的RAM储备将其出售给须要它们的人。由于Eosio支持免费的用户理念,因此运行网络的负担落在开发人员身上。咱们须要为智能合约预留足够的RAM才能在Eos网络上正常运行。node
在EOS平台上的整个智能合约开发过程当中,咱们可能会遇到这样一种状况:咱们分配的RAM不符合部署合同的要求。在这种状况下,咱们须要额外购买的带有EOS令牌的ram才能继续进行合同部署。整个过程可使用Eos-io提供的CLI工具,即keosd和cleos来完成。在咱们以前的文章中,咱们已经完成了设置本地开发环境以测试智能合约的过程。若是你已经按照文章中的那些步骤进行操做,咱们可使用相同的工具与主网和测试网进行交互,并进行一些配置更改。linux
让咱们首先将咱们的cleos应用程序指向测试网络节点而不是本地运行的nodeosd。咱们能够建立一个额外的别名来注册这个配置。算法
alias cleos-test='docker exec -i keosd /opt/eosio/bin/cleos -u http://jungle.eos9cat.com:8888 --wallet-url http://localhost:8900'
在上面的命令中,咱们建立了别名cleos-test,以便与eos9cat提供的eos测试网络节点快速交互。请注意,咱们仍然依赖咱们的本地钱包应用程序来处理咱们的私钥。 只要咱们在解锁钱包中导入相应的私钥便可。docker
提示:若是要持久保存命令,能够将命令放在~/.bashrc
文件中(若是你在linux上)和~/.bash_profile
(用于mac)。数据库
有时,当你部署包含更复杂逻辑的应用程序合约时,可能会收到相似于上述屏幕截图的错误消息,暗示智能合约账户没有足够的RAM来部署合同。在这种状况下,咱们必须从eosio.ram购买更多的ram。bash
咱们能够经过发出如下命令来快速检查咱们的ram分配:网络
cleos-test get account ${accountname}
memory
部分下的quota
属性指示账户分配的内存量。数据结构
如今咱们知道咱们有权得到多少ram,咱们怎么可能知道咱们须要多少Ram才能部署咱们的智能合约?因为Eosio区块链使用Web Assembly
执行用户生成的应用程序和代码,所以咱们能够经过将*.wasm
和*.abi
文件的大小相加来粗略估计执行智能合约所需的千字节数。除了计算粗略估计以外,咱们还必须肯定购买ram所需的Eos代币数量。工具
Eos区块链平台依靠Bancor算法经过单边交易模型促进二级ram市场,咱们能够经过查询系统合约公开的ram市场表并执行一些简单的计算来肯定Eos ram价格。区块链
要得到EOS/KiB,咱们须要将quote.balance
(链接器余额)除以base.balance
ram(token不足支付的部分),最后将该值乘以1024(即quote.balance/base.balance)*1024。在我想要部署的智能合约的示例中,须要大约100KiB,这将花费大约31.70 EOS token。 而后,咱们能够经过Cleos发出如下命令来继续实际的交易。
cleos-test system buyram -k ${payer} ${reciever} amount
k标志将指示金额参数表示要购买的KiB金额,系统合约交易将自动从付款人的帐户中扣除适当数量的EOS token。 若是没有kflag,金额将默认为花费的EOS token数量。 一样,根据ram价格,将向帐户中添加适当数量的ram。
若是咱们如今再次部署合约,它应该成功。
对于账户当前占用的不须要的ram,能够经过Banchor算法肯定的价格经过系统合约交换某些EOS token的资源。出售ram和在eos区块链上购买ram的过程相似。
cleos-test system sellram ${account} bytes
成功的交易看起来与此相似:
因为其灵活性,RAM能够说是Eos区块链平台上最受欢迎的资源。RAM不只能够用于存储中间计算状态,还能够用做持久存储。多索引数据库是Eos中的一种数据结构,它根据范围的定义方式提供存储数据的灵活性。多索引数据库将以表格格式存储持久数据。实际上,与许多其余流行的智能合约平台不一样,Eos智能合约中的交易不能返回任何值或变量,这意味着RAM捕获的任何数据都不能经过交易返回给调用者。为了得到对智能合约中的变量值的访问,例如某个计算和交易的结果,数据须要经过带有范围的多索引数据库表进行更新,一般以调用者的账户名称或智能合约自己的账户名称的形式存储数据的关联连接,而后能够经过具备相应合同名称,范围和表名称的gettable API
检索数据。
例如,每一个账户已存储在eosio.token合约中定义的多索引数据库中的EOS token数,该合约由定义范围的每一个账户的一小块RAM组成。咱们可使用如下命令直接从db检索某个账户拥有的token数量:
cleos-test get table eosio.token ${account} accounts
上述命令中的表名是accounts,范围是我的账户名。将账户余额信息与实际拥有它们的账户分配是合乎逻辑的。另外一方面,若是咱们但愿检索有关EOS token自己的信息,咱们将须要查看具备不一样表的另外一个范围,即便信息是在同一智能合约中已经编码:
cleos-test get table eosio.token EOS stats
肯定范围和表名称可能很棘手,特别是对于其余人生成的合约,一般能够经过查看合约的abi来快速检索表名。
范围更难,但能够经过查看在代码中对多索引数据库的引用查看参数来肯定。
第一个带下划线的部分显示对stats表的引用是使用sym
参数进行的,该参数表示token的SYMBOL;所以,表的范围是token的SYMBOL。
第e二个带下划线的部分描述了在交易期间减去余额时引用账户表的行。这行代码暗示表账户的范围是账户名称。
因为智能合约自己与存储在本地磁盘上的多索引数据库之间的链接仅仅是一个参考连接,所以该功能与使用同一账户屡次部署合约时一块儿授予,以便升级eos生态系统中的智能合约。只要定义多索引数据库的关键功能在新旧智能合约中相同,就能够在新的智能合约中对数据进行引用。
在某些状况下,你甚至可能会发现经过部署空合约或大小明显较小的合同来释放RAM以进行销售是有用的,同时仍然将与前合同相关的数据保留在持久存储上。
安利个私货,EOS智能合约与DApp开发入门教程:http://t.cn/RealN1W