在上一篇文章,我们下载、编译了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