EOS

EOS智能合约-Hello World与Token

简介

此篇将演示如何在EOS的测试网络中创建、加载、调用HelloWorld智能合约,以及Token合约的使用方式。

本文内容从官方:智能合约教程翻译修改所得。

为了能够顺利完成此教程需要确保:

  • 至少拥有一个账号与钱包,这里将使用之前创建的钱包:nm1024、账号:nmaccount
  • nodeos、cleos、keosd配置等无问题,可以运行;
  • 将节点账户eosio的密钥导入钱包。

加载BIOS系统合约

bios的全称是 Basic Input/Output System(基本输入输出系统),一个默认的系统合约。通过此合约,可以直接控制其他帐户的资源分配,并调用其他特权API。为合约执行预留CPU、网络活动带宽,以及预留内存。一般情况下不用去管它,只要保证它顺利加载就行。

eosio.bios合约可以在EOSIO源代码文件夹中找到:contracts/eosio.bios。以下的命令,都假定是在EOSIO源代码的根目录/data/eos执行。但是也可以通过指定完整路径${EOSIO_SOURCE}/build/contracts/eosio.bios

在加载bios合约之前需要解锁钱包账户,保证nodeos开始运行。

这个命令的结果是,cleos发起一个包含两个操作的交易:eosio::setcodeeosio::setabi。最后一个参数是-p eosio@active。该参数告诉cleos,用eosio账户的active权限签署此操作,即使用我们先前导入钱包的eosio账户私钥对操作进行签名。

在创建账号的时候填入了两个密钥,owner_key与active_key即代表了两种权限,这里选择active权限密钥签署此次操作。

代码定义了合约如何运行,abi描述了参数如何在二进制和json之间进行转换。虽然abi在技术上是可选的,但为了便于使用,所有的EOSIO工具都依赖于它,所以还是必须的

任何时候你执行一个交易,都会看到类似这样的输出:

以上输出的形式如下:


此处bios仅为合约部署的示例。

在一个完整的EOS环境中eosio.bioseosio.msigeosio.systemeosio.token、都需要部署。eosio.system合约建议使用eosio账号部署;

这里就不一一说明了;一旦部署了eosio.system那么在注册账号等操作的时候会需要RAM、NET、CPU三种资源,而且只能注册12字符长度的账号。
详见此篇文章

Hello World智能合约

现在创建第一个“Hello world”合约。创建一个名为“hello”的新文件夹,进入该文件夹然后使用以下内容创建一个文件“hello.cpp”(我这里的路径为/data/test-contract/hello/hello.cpp):

使用如下命令将代码编译为Web程序集(.wast):

完成之后会在这个文件夹下生成两个文件,hello.wasmhello.wast

生成hello.abi:

eosiocpp从v1.2.0弃用,将在v1.3.0中删除,由eosio.wasmsdk替代此功能。
eos里边每个账户只能发布一个合约,所以认为账户与合约是对应的,账户下可以没有合约,如果有则只能有一个。
所以在这里需要新建一个账户发布hello合约(为了方便两个公钥可以使用同一个):

运行合约:

此处'["nmaccount"]'仅仅是一个参数,-p nmaccount@active是执行合约并授权的账户;这个合约允许任何人授权。如果想限定授权人与参数为同一人可以将hello.cpp修改为以下内容,再次执行上述操作:

这样的话就会对参数进行权限的验证,如果和执行人不匹配会抛出错误


如果运行之后没有发现>> Hello, nmaccount这行输出,那么需要使用nodeos --contracts-console来运行nodeos,打开了以后在上边运行合约的命令执行完后会在nodeos端看到:

Ricardian Contract(李嘉图合约)

在官方的介绍中说了,每个智能合约都必须有一个匹配的李嘉图合约。李嘉图合约规定了与智能合约的每个行为相关的具有法律约束力的行为。并列出了Hello World合约的李嘉图合约。

但是官方没有详细说明Ricardian Contract(李嘉图合约)是个什么东西,最后搜到一篇关于李嘉图合约EOS上的李嘉图合约介绍详细的文章。

发布Token

官方提供了Token合约/data/eos/build/contracts/eosio.token,使用它的方式和其他合约一样,创建一个账户,并使用该账户创建Token合约:

然后试试创建Token:

这行命令表示创建最大供应量1000000000个的CYB,币的最小精度是0.0001。其中[ "eosio", "1000000000.0000 CYB"]可以改为'{"issuer":"eosio", "maximum_supply":"1000000000.0000 CYB"}'来体现参数对应关系。

然后将Token派发给指定人,并查看余额:

这次输出包含几个不同的操作:一个issue和三个transfer。虽然我们签署执行的是issue,但是issue内部执行inline transfer(Inline通信模式),inline transfer通知发送和接收的帐户。这里的输出表明了被调用的Action处理的数据、触发的顺序、是否生成输出。

从技术上讲,是可以直接修改余额。但是,智能合约约定规定了所有帐户余额要通过使用它们内部的转移操作来实现。它还要求通知资金的发送方和接收方,以便它们可以自动处理。

接下来我们试试转账的功能,这里需要新建另外一个账号:


.
.
.
.
.
.
.
【本文章出自NM1024.com,转载请注明作者出处。】

1 thought on “EOS智能合约-Hello World与Token”

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据