EOS智能合约开发系列(二)

在上一篇文章,我们下载、编译了EOS源码,生成了nodeos,keosd,cleos,eosiocpp等这些工具。同时我们也配置好了单节点出块的nodeos。下面我们继续。


区块链数据的位置

上一篇文章中,我们用nodeos成功启动了一个测试节点,从终端中可以看到它每隔0.5s出一个块。那么这些出块的历史数据,也就是区块链数据,都保存在哪里了呢?

不同的操作系统,block数据默认保存的位置不同:

  • Mac OS: ~/Library/Application\ Support/eosio/nodeos/data
  • Linux: ~/.local/share/eosio/nodeos/data

当你把这里面block/state/文件夹删掉之后,再重新启动nodeos,你会发现它又从0开始出块了。

创建钱包

$ 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.
"PW5HvGibpV6HtMBYRBocEztAWcnGmSwNukFtRjdvAXf6gywvKnhyY"

上面命令创建了一个默认(default)钱包,记得把最后一行的钱包密码好好保存,以后当需要对钱包解锁的时候,都会用到这个密码。

注意,如果你在这一步,看到如下提示:

➜  ~ cleos wallet create
No wallet service listening on 127.0.0.1:8900. Cannot automatically start keosd because keosd was not found.
Failed to connect to keosd at http://127.0.0.1:8900/; is keosd running?

说明找不到keosd,你需要把编译好的keosd放在/usr/local/bin/目录下,或者找到keosd所在的目录,自己手动去运行keosd也可以。
在macOS上,我发现,在上一篇的sudo make install的时候,会把build/programs/keosd/keosd拷贝到/usr/local/eosio/bin里。所以我可以在/usr/local/bin里面建立一个符号链接,指向/usr/local/eosio/bin/keosd

ln -s /usr/local/eosio/bin/keosd /usr/local/bin/keosd

linux上面,不知道会不会遇到这个问题,如果遇到了,也可以用这种方式去解决。

另外,也可以手动运行keosd。
首先修改keosd的配置文件${HOME}/eosio-wallet/config.ini。找到里面的http-server-address配置项,改成下面的值。

# The local IP and port to listen for incoming http connections; set blank to disable. (eosio::http_plugin)
http-server-address = 127.0.0.1:8900

然后,直接keosd即可启动。

解锁钱包

每次你重新启动 keosd之后,钱包会变成lock状态;有时候,当你长时间没有操作的时候,钱包也会变成lock状态。这时你就需要去解锁(unlock)它,可以使用如下命令:

$ cleos wallet unlock
password:

它会提示你输入钱包密码,这时候只需要把上面创建钱包时保存的密码输入在这里就可以了。

有时候,你可能想主动锁住钱包,可以这样:

cleos wallet lock

钱包数据的位置

钱包数据的位置,默认在:$HOME/eosio-wallet,当你把这个这个文件夹删掉了,你就需要重新创建钱包。

创建自己的key-pair

$ cleos create key
cleos create key
Private key: 5KWatoy1mpAyUE1uuaCGX39aug9yZ65KW2GWkRdzBCSRMwMD92P
Public key: EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr

每次创建的key-pair都会不同。注意,这里仅仅创建了这一对ke-pair: 公钥和私钥。并没有和账户关联。
为了演示方便,我后面将会使用这对key-pair。注意,如果你打算把一对key-pair(公钥和私钥对)用在主网上,你的私钥应该保密,不应该像我这样把私钥公开。

下面为了使用这一对公钥和私钥,我们把它导入钱包,只需要传入私钥即可,它会自动计算出公钥:

cleos wallet import --private-key 5KWatoy1mpAyUE1uuaCGX39aug9yZ65KW2GWkRdzBCSRMwMD92P

导入成功后,我们检查一下:

➜  eosio-wallet cleos wallet keys
[
  "EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr"
]

如上所示,我们查看当前钱包里的keys,这里只会显示出公钥,也正是我们前面创建的key-pair里的公钥。

加载BIOS合约

BIOS合约是一个系统合约,因为我们只是用于开发和测试,只需要加载默认的eosio.bios合约就好了,我们可以使用这个合约来直接控制其他账户的资源,包括CPU、网络以及内存等。在公链上,这个合约将能够管理抵押和回收token。

eosio.bios的合约代码位于contracts/eosio.bios位置,它编译之后的位置在这里:build/contracts/eosio.bios。注意,我给出的这些目录都是相对于EOS源码的根目录的。

我们在加载这个合约之前,需要在我们的钱包里导入一个特殊的key。还记得我们之前配置nodeos的那个config.ini吗?里面有这么一个配置:

signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

它的格式是这样的:

signature-provider={public-key}=KEY:{private-key}

配置在这里的key,哇,厉害了,它是系统合约的签名所专用的。我们的eosio.bios合约就是一个系统合约,所以我们需要用到这组key-pair。当然了,因为我们是单节点,你是可以任意修改这里的配置的。不过呢,不羁这里就不做修改了,保持原样了。下面我们只需要把这组key导入钱包,就可以加载bios合约了。

cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

然后加载 eosio.bios

➜  eos git:(master) ✗ cleos set contract eosio build/contracts/eosio.bios -p eosio@active
Reading WAST/WASM from build/contracts/eosio.bios/eosio.bios.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: c5c77223c776cb92ea16d5e17785b5b4338c4f3525b610a432529c9e93afe51c  3720 bytes  3873 us
#         eosio <= eosio::setcode               {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001621260037f7e7f0060057f7e7e7e7e...
#         eosio <= eosio::setabi                {"account":"eosio","abi":"0e656f73696f3a3a6162692f312e30050c6163636f756e745f6e616d65046e616d650f7065...

上面这个加载合约的过程,发生了两个action:一个是eosio::setcode,一个是eosio::setabi

上面你看到了类似这样的东西:eosio <= eosio::setabi,这句话的格式这样的:${executor} <= ${contract}:${action} ${args...}。比如eosio <= eosio::setabi可以翻译为:eosio执行了eosio合约里的setabi这个action。

命令中的-p eosio@active参数,是告诉cleos用eosio的活动账户来签名授权,也就是使用我们刚刚导入的那个私钥来签名。

今天就到这里,明天继续。
简介:不羁,一名程序员;专研EOS技术,玩转EOS智能合约开发。
微信公众号:know_it_well
知识星球地址:https://t.zsxq.com/QvbuzFM

你可能感兴趣的:(EOS智能合约开发系列(二))