本篇文章,将跟你们介绍eos私链的激活、基础智能合约的安装,以及为你们演示转帐等基础操做。尚未安装eos私链的同窗,能够参考我上篇文章,先搭建好私链。node
承接上篇文章,咱们启动私链 —> 建立公私钥对 —> 建立钱包 —> 将公私钥对导入钱包 —> 建立user帐户。有同窗会问,咱们何时能发交易、作一些转帐等基本操做?那咱们就不得不提出一个新概念—智能合约。简单来讲,智能合约是条款以计算机语言而非平常语言或法律语言记录的智能合同,其工做的基本原理相似于计算机程序的if-then语句,在预先设定的条件达成时,就自动执行相应的合同条款。ios
eos的全部功能,都是基于智能合约完成的。因此,若是咱们要激活私链,想在私链上完成转帐等交易,就须要部署eos的基础合约。eos有几个比较重要的系统合约,是咱们必需要部署的:c++
- eosio.bios:eos的系统启动合约。这个合约是eos不少命令的基础合约,让咱们能够直接经过eosio帐户控制eos私链web
- eosio.token:eos的发币合约。系统执行这个合约发行EOS,合约实现了指定代币发行给哪一个帐户、代币最大发行量、转帐方法等功能ide
- eosio.msig:eos的提案合约。EOS持有人可使用合约方法提出一个提案,其余人能够表决经过或者不经过这个提案,经过这个合约能实现交易的多重签名方案函数
- eosio.system:eos的系统命令合约。这个合约几乎实现了eos所有的系统命令,包括建立帐户、资源质押、超级节点投票、域名竞拍等功能工具
全部的系统合约都在eos/contracts目录下面,这几个合约内部的方法实现细节,我会单独写文章介绍,你们如今只须要大体记住它们的做用便可。命令行
咱们将模拟eos主网的部署启动过程,对eos私链进行激活:建立一系列系统帐户、部署一系列系统合约、发币、选举超级节点等,你们跟着我一步一步操做。日志
第一步,部署eosio.bios系统合约,部署帐户为eosio。orm
咱们须要使用cleos命令行工具部署智能合约
cd eos
cleos set contract eosio contracts/eosio.bios -p eosio
tips:
- 这个操做是将eosio.bios合约部署到了eosio帐户上,-p是指定受权帐户为eosio。执行这个命令时,钱包必定要处于unlock状态,方便调取eosio帐户的私钥。
- 执行cleos set contract时,可能会出现下面的报错:
这是由于eos的虚拟机使用的是webassembly,智能合约源码是用c++写的,须要先编译成wasm/wast文件,再部署到eos上面,才能被虚拟机执行。咱们使用eos自带的工具eosiocpp去编译源码,这个工具在节点安装时就已经安装好了:
cd eos/contracts/eosio.bios
eosiocpp -o eosio.bios.wast eosio.bios.cpp
第二步,建立一系列系统帐户。
eos的系统帐户是用来部署智能合约的,由eosio帐户建立,有如下几个帐户:
- eosio.bpay:超级节点获取出块奖励的临时代管帐户,增发EOS的1%的25%会先转到这个帐户
- eosio.msig:用来部署eosio.msig合约
- eosio.names:用来管理域名竞拍
- eosio.ram:用来管理ram买卖
- eosio.ramfee:用来管理ram买卖产生的手续费,每笔买卖扣1%的手续费
- eosio.saving:增发EOS临时存放帐户,增发总量 5%,其中80%放在此帐户,另外 20%再分红25%和75%,分别给eosio.bpay和eosio.vpay
- eosio.stake:用来管理抵押换取cpu、net资源的EOS
- eosio.token:用来部署eosio.token合约
- eosio.vpay:节点们按照得到投票多少比例获取奖励的临时代管帐户,增发EOS的1%的75%会先转到这个帐户
使用cleos create key生成公私钥对,再将私钥导入钱包,最后执行cleos create account生成系统地址,忘记怎么操做的同窗,请回顾我上篇内容中的钱包、帐户部分。
cleos create key
cleos wallet import -n <wallet name> --private-key <private key>
cleos create account eosio <system account name> <owner public key> <active public key>
给你们举个例子,展现eosio.token帐户是怎么建立的:
第三步,部署eosio.token合约,部署帐户为eosio.token。
cd eosio
cleos set contract eosio.token contracts/eosio.token -p eosio.token
第四步,部署eosio.msig合约,部署帐户为eosio.msig。
cd eos
cleos set contract eosio.msig contracts/eosio.msig -p eosio.msig
第五步,发布EOS代币,调用eosio.token帐户下的eosio.token智能合约的create函数。
cleos push action eosio.token create '[ "eosio", "1000000000.0000 EOS"]' -p eosio.token
tips:cleos push action命令,用来触发eosio.token合约的create函数,代币发行帐户是eosio,发行量10亿,代币的符号是EOS。
第六步,将EOS资产打入eosio帐户,调用eosio.token帐户下的eosio.token智能合约的issue函数。
由于EOS的发行人是eosio帐户,因此调用issue这个函数,须要eosio帐户受权
cleos push action eosio.token issue '[ "eosio", "1000000000.0000 EOS", "test message"]' -p eosio
第七步,部署eosio.system合约,部署帐户为eosio。
cd eos
cleos set contract eosio contracts/eosio.system -p eosio -x 1000
第八步,建立帐户。
这里咱们建立帐户,将使用cleos system newaccount命令,这是eos上建立普通帐户所用的命令,底层实际上调用的是eosio.system合约的newaccount函数。以前提到的cleos create account命令,实际上是为了eosio帐户建立系统帐户提供的命令,须要特殊权限才能执行。
cleos system newaccount <account to pay for create cost> <new account name> <owner public key> <active public key> --stake-net <amount> --stake-cpu <amount> --buy-ram <amount>
eosio帐户建立了一个帐户voter1,为这个新帐户抵押了20000EOS、20000EOS去换取cpu和net资源,付费20000EOS为这个帐户买了ram资源。
tips:
- 新建立的帐户,须要抵押必定的EOS去换取cpu、net资源,须要花费必定EOS去买ram资源,用于交易的发送。用于抵押cpu和net的EOS是能够赎回的,赎回须要3天时间。
- 资源的分配是按比例的。好比,抵押全网1%的eos,就能够换取全网1%的cpu或者net资源。
- cpu和net资源是可再生的,使用后一天就可恢复,ram是不可再生资源,用完得再买。
第九步,投票选举超级节点
上一步,咱们建立两个帐户voter1和bp1。eos的主链或者私链,初始的时候都是被系统帐户eosio控制的。可是,若是想要激活eos的全部功能,则必须投票选举超级节点,且全网投票必须超过发行总量的15%,即1.5个亿。主链上是选举21个超级节点,它们轮流出块。私链上,咱们只须要选举一个超级节点,让它出块便可。下面,咱们将为你们演示超级节点的选举过程。
1)eosio将1.5亿EOS转帐给voter1
cleos transfer eosio voter1 "150000000.0000 EOS" -p eosio
2)voter1将EOS抵押为cpu、net资源,由于只有抵押为资源的EOS才能用于投票。
cleos system delegatebw voter1 voter1 "150000000.0000 EOS" "0 EOS"
咱们抵押了1.5亿 EOS去换cpu资源,0 EOS去换net资源。cleos system delegatebw命令详情以下,from是出抵押的EOS的帐户,to是接收抵押资源的帐户,stake_net_quantity和stake_cpu_quantity是抵押EOS的金额:
3)将bp1注册为超级节点,只有注册的帐户,其余帐户才能给它投票
cleos system regproducer bp1 <bp1's public key>
4)voter1投票给bp1,这里的投票是帐户行为,等于将voter1抵押的所有EOS都投给了bp1
cleos system voteproducer prods voter1 bp1
这步执行完毕后,私链就算激活了,这时你会发现eosio帐户已经不能出块了,咱们须要修改配置文件config.ini,将producer-name替换为bp1,signature-provider换成bp1的公私钥对,而后执行nodeos重启节点,这时就是bp1负责出块了
激活了私链以后,咱们就解锁了eos所有的功能。下面,我将为你们介绍下EOS上的基本操做,如:查询帐户详情、转帐、质押资源、投票、查询帐户余额等
1)查询帐户,这个命令能够看到帐户的基本权限、cpu和net的质押和使用状况
cleos get account <account name>
2)转帐
cleos transfer <from account> <to account> <amount> <transfer message>
3)查询帐户余额
cleos get currency balance <发币合约部署的帐户> <account name> <代币符号>
4)质押EOS换取cpu、net资源
cleos system delegatebw <from account> <to account> <amount of EOS for cpu> <amount of EOS for net>
from account和to account相同时,是本身给本身质押资源;不一样时,是其余帐户帮忙质押资源给本身。
5)取消资源质押
cleos system undelegatebw <from account> <to account> <amount of EOS for cpu> <amount of EOS for net>
6)查看待赎回的资源
取消质押后,EOS并不会立刻回到帐户余额里,须要等待三天。这时能够在refunds表里查看待赎回的资源。
cleos get table <合约部署帐户> <account name> refunds
7)手动触发refund
若是三天后发现EOS还没回到余额里,则须要手动触发refund函数。undelegatebw命令,本质上是在函数里延迟三天调用refund函数,属于合约调合约,有失败的可能。这里我很少作解释,从此会专门写一篇文章具体介绍。refund函数属于eosio.system合约,因此须要使用cleos push action命令:
cleos push action eosio refund '["account"]' -p account
由于没到3天就触发refund,节点的输出日志会报错,须要等待
1)注册为候选超级节点,注册以后其余帐户才能为其投票
cleos system regproducer <account name> <public>
2)为超级节点投票
cleos system voteproducer prods <account name> <account you want to vote>
3)查看超级节点投票状况
cleos system listproducers