本教程的目的是演示如何设置
可用于试验智能合约的本地区块链。
本教程的第一部分将重点介绍:
- 启动私人区块链
- 创建钱包
- 加载Bios合同
- 创建帐户
本教程的第二部分将指导您创建和部署
自己的合同。
- eosio.token合同
- Exchange 合同
- Hello World 合约
本教程假设您已经安装了EOSIO,nodeos
并且cleos
在您的路径中。
第1步:启动您的节点
您可以使用以下单个命令启动自己的单节点区块链:
$ nodeos -e -p eosio --plugin eosio::chain_api_plugin \
--plugin eosio::history_api_plugin
此命令设置许多标志并加载一些可选插件,我们将在本教程的其余部分中使用这些插件。假设一切正常,您应该每0.5秒看一次块生成消息。
...
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]
这意味着您的本地区块链是实时的,生成块,并准备好使用。
有关参数的更多信息,nodeos
请使用:
nodeos --help
第2步:创建电子钱包
钱包是授权区块链上的操作所必需的私钥的存储库。这些密钥存储在使用为您生成的密码加密的磁盘上。此密码应存储在安全的密码管理器中。
$ cleos wallet create --to-console
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5JuBXoXJ8JHiCTXfXcYuJabjF9f9UNNqHJjqDVY7igVffe3pXub"
注意:以前,在本教程中,钱包由您当地的管理人员
nodeos
通过eosio::wallet_api_plugin
。不再使用此选项,因为cleos会自动
启动keosd
。
$ cleos wallet unlock \
--password PW5JuBXoXJ8JHiCTXfXcYuJabjF9f9UNNqHJjqDVY7igVffe3pXub
Unlocked: default
直接在命令行上使用您的密码并将其记录到您的bash历史记录中通常是不安全的,因此您也可以在交互模式下解锁:
$ cleos wallet unlock
password:
出于安全考虑,通常最好在不使用钱包时将钱包锁定。要在不关闭的情况下锁定钱包,nodeos
您可以:
$ cleos wallet lock
Locked: default
在本教程的其余部分中,您将需要解锁您的钱包。
上述步骤中启动的私有区块链是使用默认初始密钥创建的,必须将其加载到钱包中(如下所示)
$ cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
第3步:加载BIOS合同
现在我们有一个带有eosio
加载帐户密钥的钱包,我们可以设置默认的系统合同。出于开发目的,eosio.bios
可以使用默认合同。通过此合同,您可以直接控制其他帐户的资源分配并访问其他特权API调用。在公共区块链中,此合同将管理标记的放样和取消,以保留CPU和网络活动的带宽以及合同的内存。
该eosio.bios
合同可以在中找到contracts/eosio.bios
你的EOSIO源代码文件夹。下面的命令序列假定它是从EOSIO源的根目录执行的,但您可以通过指定完整路径从任何地方执行它${EOSIO_SOURCE}/build/contracts/eosio.bios
。
$ 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::setcode
和eosio::setabi
。
代码定义了合同的运行方式,abi描述了如何在参数的二进制和json表示之间进行转换。虽然abi在技术上是可选的,但所有EOSIO工具都依赖于它以便于使用。
每次执行交易时,您都会看到如下输出:
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...
这可以理解为:setcode
定义的动作eosio
是通过eosio
合同执行的{args...}
。
# ${executor} <= ${contract}:${action} ${args...}
> console output from this execution, if any
正如我们稍后会看到的,可以通过多个合同处理操作。
这次电话会议的最后一个论点是-p eosio@active
。这告诉cleos
我们使用eosio
帐户的活动权限签署此操作,即使用eosio
我们之前导入的帐户的私钥对操作进行签名。
第4步:创建帐户
现在我们已经设置了基本系统合同,我们可以开始创建自己的帐户。我们将创建两个帐户,user
并且tester
我们需要将密钥与每个帐户相关联。在此示例中,两个帐户将使用相同的密钥。
为此,我们首先为帐户生成密钥。
$ cleos create key
Private key: 5Jmsawgsp1tQ3GD6JyGCwy1dcvqKZgX6ugMVMdjirx85iv5VyPR
Public key: EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
然后我们将此密钥导入我们的钱包:
$ cleos wallet import --private-key 5Jmsawgsp1tQ3GD6JyGCwy1dcvqKZgX6ugMVMdjirx85iv5VyPR
imported private key for: EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
注意:请务必使用cleos
命令生成的实际键值,而不是上面示例中显示的键值!
密钥不会自动添加到钱包中,因此跳过此步骤可能会导致您失去对帐户的控制权。
创建两个用户帐户
接下来,我们将创建两个帐户,user
并tester
使用我们在上面创建和导入的密钥。
$ 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...
注:该create account
子命令需要两个按键,一个是OwnerKey(这在生产环境中应保持高度安全),一个用于ActiveKey。在本教程示例中,两者都使用相同的密钥。
因为我们正在使用,所以eosio::history_api_plugin
我们可以查询由我们的密钥控制的所有帐户:
$ cleos get accounts EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
{
"account_names": [
"tester",
"user"
]
}