EOS开发从智能合约开始(一)

本教程的目的是演示如何设置本地区块链,然后用来试验EOS如何开发智能合约。第一部分教程将着重于:

  • 启动私有链
  • 创建钱包
  • 加载Bios合约
  • 创建帐户

本教程的第二部分将完成创建和部署你自己的智能合约:

  • eosio.token 合约
  • Exchange 合约
  • Hello World 合约

假定你已经安装了EOSIO,而且nodeoscleos在你的目录下。

启动私有链

你可以用这个命令启动你自己的单节点区块链:

1
2
$ nodeos -e -p eosio --plugin eosio::chain_api_plugin \
--plugin eosio::history_api_plugin

这个命令设置了许多标志并加载了一些可选的插件,我们将在本文的其余部分中使用。假设一切正常运行,你应该每隔0.5秒就看到一个块生成消息。

1
2
3
...
3165501ms thread-0 producer_plugin.cpp:944 produce_block ] Produced block 00000a4c898956e0... #2636 @ 2018-05-25T16:52:45.500 signed by eosio [trxs: 0, lib: 2635, confirmed: 0]
3166004ms thread-0 producer_plugin.cpp:944 produce_block ] Produced block 00000a4d2d4a5893... #2637 @ 2018-05-25T16:52:46.000 signed by eosio [trxs: 0, lib: 2636, confirmed: 0]

这意味着你的本地区块链是ok的,生产块,并准备好了。

有关nodeos的参数更多信息你可以help一下:

1
nodeos --help

创建钱包

钱包是一个私钥存储库,用于授权在区块链上的操作。这些密钥存储在为你生成的密码进行了加密磁盘上。此密码存储在一个安全密码管理器中。

1
2
3
4
5
$ cleos wallet create
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5JuBXoXJ8JHiCTXfXcYuJabjF9f9UNNqHJjqDVY7igVffe3pXub"

注意:之前老版本的教程中,钱包是通过本地nodeoseosio::wallet_api_plugin插件来管理的。因为cleos自动启动keosd,所以不再使用此选项。

1
2
3
$ cleos wallet unlock \
--password PW5JuBXoXJ8JHiCTXfXcYuJabjF9f9UNNqHJjqDVY7igVffe3pXub
Unlocked: default

使用命令行直接登录bash由于会留下历史记录通常是不安全的,因此也可以在交互模式下解锁:

1
2
$ cleos wallet unlock
password:

为了安全起见,最好是在不使用钱包时把钱包锁上。锁你的钱包,不关闭nodeos你就可以做到:

1
2
$ cleos wallet lock
Locked: default

本文的其余部分将需要解锁钱包。

加载教程密钥

在上面的步骤中启动的私有链是用一个默认的初始密钥创建的,它必须被加载到钱包中。

1
2
$ cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

加载Bios合约

现在我们有一个带有eosio帐户的密钥的钱包,我们可以设置一个默认的系统合约。为了学习开发,可以使用默认的eosio.bios合约。这个智能合约使我们能够直接控制其他帐户的资源分配,并访问和调用一些必要的API。如果在一个公共链中,这个合约将管理tokens是在堆栈中还是不在堆栈中,以保留CPU和网络活动的带宽,以及合约的内存。

eosio.bios合约可以在eosio源代码的contracts/eosio.bios文件夹中找到。下面的命令假定它是从eosio源代码的根目录执行的,但是也可以通过指定完整路径来从任何地方执行它,${EOSIO_SOURCE}/build/contracts/eosio.bios。

1
2
3
4
5
6
7
$ cleos set contract eosio build/contracts/eosio.bios -p eosio@active
Reading WAST...
Assembling WASM...
Publishing contract...
executed transaction: 414cf0dc7740d22474992779b2416b0eabdbc91522c16521307dd682051af083 4068 bytes 10000 cycles
# eosio <= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001ab011960037f7e7f0060057f7e7e7e...
# eosio <= eosio::setabi {"account":"eosio","abi":{"types":[],"structs":[{"name":"set_account_limits","base":"","fields":[{"n...

这个命令的结果是cleos用两个指令eosio::setcodeeosio::setabi生成一个交易。

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

在执行交易的任何时候,都会看到输出:

1
2
3
executed transaction: 414cf0dc7740d22474992779b2416b0eabdbc91522c16521307dd682051af083  4068 bytes  10000 cycles
# eosio <= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001ab011960037f7e7f0060057f7e7e7e...
# eosio <= eosio::setabi {"account":"eosio","abi":{"types":[],"structs":[{"name":"set_account_limits","base":"","fields":[{"n...

这可以理解为:由eosio定义的指令setcode是由eosio合约与{args...}共同执行的。

1
2
#         ${executor} <= ${contract}:${action} ${args...}
> console output from this execution, if any

正如我们将看到的,一个指令可以通过一个以上的合约来处理。

这个调用的最后一个参数是-p eosio@active。这告诉cleos使用eosio帐户激活的权限来签署这个指令,也就是说,使用较早导入的eosio帐户的私钥来签署操作。

创建帐户

现在,我们已经建立了基本系统合约,我们可以开始创建自己的帐户。我们将创建两个帐户,usertester,并且我们需要将密钥与每个帐户相关联。在这个例子中,两个帐户都使用相同的密钥。

要做到这一点,我们首先生成一个帐户的密钥。

1
2
3
$ cleos create key
Private key: 5Jmsawgsp1tQ3GD6JyGCwy1dcvqKZgX6ugMVMdjirx85iv5VyPR
Public key: EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4

然后我们把这个密钥输入到我们的钱包里:

1
2
$ cleos wallet import 5Jmsawgsp1tQ3GD6JyGCwy1dcvqKZgX6ugMVMdjirx85iv5VyPR
imported private key for: EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4

注意:读者练习的时候要使用cleos命令生成的实际键值,而不是上面示例中所示的键值。

键不会自动添加到钱包,所以跳过这一步可能会导致失去对你的帐户控制。

创建两个用户帐户

接下来,我们将使用上面创建和导入的密钥创建两个帐户,usertester

1
2
3
4
5
6
7
$ cleos create account eosio user EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
executed transaction: 8aedb926cc1ca31642ada8daf4350833c95cbe98b869230f44da76d70f6d6242 364 bytes 1000 cycles
# eosio <= eosio::newaccount {"creator":"eosio","name":"user","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJxentZZ...

$ cleos create account eosio tester EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
executed transaction: 414cf0dc7740d22474992779b2416b0eabdbc91522c16521307dd682051af083 366 bytes 1000 cycles
# eosio <= eosio::newaccount {"creator":"eosio","name":"tester","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJxentZZ...

注意:创建帐户子命令需要两个密钥,一个用于OwnerKey(在生产环境中应该保持高度安全),一个用于ActiveKey。在本教程示例中,两个都使用相同的密钥。

因为我们使用的是eosio::history_api_plugin,我们可以查询所有由我们的密钥控制的帐户:

1
2
3
4
5
6
7
$ cleos get accounts EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
{
"account_names": [
"tester",
"user"
]
}

第一部分就到先到这里了。

另:《EOS智能合约与DApp开发入门》教程已经上线,爱学习等不及的可以抓紧体验一下:

EOS教程

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

  • web3j教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。

汇智网原创翻译,转载请标明出处。这里是原文