美文网首页
EOS智能合约开发系列(二)

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

作者: 鹏飞_3870 | 来源:发表于2018-08-12 07:51 被阅读0次

    在上一篇文章,我们下载、编译了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智能合约开发系列(二)

          本文链接:https://www.haomeiwen.com/subject/kuacbftx.html