EOS内存RAM买卖详解

作者: 编程狂魔 | 来源:发表于2018-09-18 09:23 被阅读19次

对于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网络上正常运行。

购买RAM

在EOS平台上的整个智能合约开发过程中,我们可能会遇到这样一种情况:我们分配的RAM不符合部署合同的要求。在这种情况下,我们需要额外购买的带有EOS令牌的ram才能继续进行合同部署。整个过程可以使用Eos-io提供的CLI工具,即keosd和cleos来完成。在我们之前的文章中,我们已经完成了设置本地开发环境以测试智能合约的过程。如果你已经按照文章中的那些步骤进行操作,我们可以使用相同的工具与主网和测试网进行交互,并进行一些配置更改。

让我们首先将我们的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测试网络节点快速交互。请注意,我们仍然依赖我们的本地钱包应用程序来处理我们的私钥。 只要我们在解锁钱包中导入相应的私钥即可。

提示:如果要持久保存命令,可以将命令放在~/.bashrc文件中(如果你在linux上)和~/.bash_profile(用于mac)。

image

有时,当你部署包含更复杂逻辑的应用程序合约时,可能会收到类似于上述屏幕截图的错误消息,暗示智能合约帐户没有足够的RAM来部署合同。在这种情况下,我们必须从eosio.ram购买更多的ram。

我们可以通过发出以下命令来快速检查我们的ram分配:

cleos-test get account ${accountname}
image

memory部分下的quota属性指示帐户分配的内存量。

现在我们知道我们有权获得多少ram,我们怎么可能知道我们需要多少Ram才能部署我们的智能合约?由于Eosio区块链使用Web Assembly执行用户生成的应用程序和代码,因此我们可以通过将*.wasm*.abi文件的大小相加来粗略估计执行智能合约所需的千字节数。除了计算粗略估计之外,我们还必须确定购买ram所需的Eos代币数量。

Eos区块链平台依靠Bancor算法通过单边交易模型促进二级ram市场,我们可以通过查询系统合约公开的ram市场表并执行一些简单的计算来确定Eos ram价格。

image

要获得EOS/KiB,我们需要将quote.balance(连接器余额)除以base.balanceram(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。

image

如果我们现在再次部署合约,它应该成功。

image

出售RAM

对于帐户当前占用的不需要的ram,可以通过Banchor算法确定的价格通过系统合约交换某些EOS token的资源。出售ram和在eos区块链上购买ram的过程类似。

cleos-test system sellram ${account} bytes

成功的交易看起来与此类似:

image

持久存储

由于其灵活性,RAM可以说是Eos区块链平台上最受欢迎的资源。RAM不仅可以用于存储中间计算状态,还可以用作持久存储。多索引数据库是Eos中的一种数据结构,它根据范围的定义方式提供存储数据的灵活性。多索引数据库将以表格格式存储持久数据。实际上,与许多其他流行的智能合约平台不同,Eos智能合约中的交易不能返回任何值或变量,这意味着RAM捕获的任何数据都不能通过交易返回给调用者。为了获得对智能合约中的变量值的访问,例如某个计算和交易的结果,数据需要通过带有范围的多索引数据库表进行更新,通常以调用者的帐户名称或智能合约本身的帐户名称的形式存储数据的关联链接,然后可以通过具有相应合同名称,范围和表名称的gettable API检索数据。

例如,每个帐户已存储在eosio.token合约中定义的多索引数据库中的EOS token数,该合约由定义范围的每个帐户的一小块RAM组成。我们可以使用以下命令直接从db检索某个帐户拥有的token数量:

cleos-test get table eosio.token ${account} accounts
image

上述命令中的表名是accounts,范围是个人帐户名。将帐户余额信息与实际拥有它们的帐户分配是合乎逻辑的。另一方面,如果我们希望检索有关EOS token本身的信息,我们将需要查看具有不同表的另一个范围,即使信息是在同一智能合约中已经编码:

cleos-test get table eosio.token EOS stats

确定范围和表名称可能很棘手,特别是对于其他人生成的合约,通常可以通过查看合约的abi来快速检索表名。

image

范围更难,但可以通过查看在代码中对多索引数据库的引用查看参数来确定。

image

第一个带下划线的部分显示对stats表的引用是使用sym参数进行的,该参数表示token的SYMBOL;因此,表的范围是token的SYMBOL。

第e二个带下划线的部分描述了在交易期间减去余额时引用帐户表的行。这行代码暗示表帐户的范围是帐户名称。有关在智能合约中使用多索引数据库的更多教程和信息,请继续关注我们的另外一篇文章

升级合约

由于智能合约本身与存储在本地磁盘上的多索引数据库之间的连接仅仅是一个参考链接,因此该功能与使用同一帐户多次部署合约时一起授予,以便升级eos生态系统中的智能合约。只要定义多索引数据库的关键功能在新旧智能合约中相同,就可以在新的智能合约中对数据进行引用。

在某些情况下,你甚至可能会发现通过部署空合约或大小明显较小的合同来释放RAM以进行销售是有用的,同时仍然将与前合同相关的数据保留在持久存储上。

======================================================================

分享一个交互式的在线编程实战,EOS智能合约与DApp开发入门

EOS教程

本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。

另外推荐几个以太坊教程:

  • web3j教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和事件等。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。

这里是原文

相关文章

网友评论

    本文标题:EOS内存RAM买卖详解

    本文链接:https://www.haomeiwen.com/subject/wlkynftx.html