【一五一十】启动主网的最后一步:社区如何获得eosio账户的控制权限

字数 2248阅读 1063

主网启动进展

EOS 主网启动工作正在顺利进行,安全测试和软件功能测试也并行展开,来自全球的九十多个备选节点加入到测试之中,夜以继日的工作,为了主网安全顺利的上线而努力。

当前有两条测试网络并行存在,分别是EOS Bios 团队和 EOS Core(原ghost bustor)团队各自搭建的测试网络,简称B网和C网,最终采用那条测试网络,还是另外新建一条网络,还有待出块节点社群共同决定,不过,大家的目标是一致的,只承认一条主网为EOS,各团队也为这一目标而努力。

相信这几日内,主网启动应该就可以完成。关于 EOS 启动有新的进展,我也会尽快告知各位读者。

QQ图片20180515172850.jpg

主网启动必不可少的一环

当前对于快照,系统合约,系统账号等的创建和检测工作已经完成,对系统安全性和可用性的检测正在进行,不过,主网启动之前还有一点没有得到大家的注意,cryptoLions团队在steemit上面发布了一篇文章,介绍主网启动的重要一环,即,如何使用multisig库进行多签,在没有eosio的情况下,各个出块节点如何处理系统层的一些问题,比如更新合约,更新系统等问题。

eosio账户重新设定

将eosio这一账户的权限设置给一个系统账户,eosio.prods@active,这个系统账户是由活跃的出块节点来组成的;

然后,将系统账户 (eosio.bpay, eosio.msig, eosio.names, eosio.ram, eosio.ramfee, eosio.saving, eosio.stake, eosio.token, eosio.vpay) 的active 权限 和 owner 权限,设置给了eosio这一账户。

什么意思呢? 我尝试解释一下。

在这里,eosio相当于起到了一个中转的作用,出块节点比如EOS Cannon, EOS Asia,EOS Canada,CryptoLions等,他们都具有eosio.prods这个账户的active权限,一笔特殊的交易经过一定数量节点的共同签名,比如21个节点之中的15个的签名,一笔交易才能够有效;

eosio.prods对应的是eosio账户的权限,而eosio这个账户则可以控制多个系统账户,比如eosio.token等,简略来说,出块节点通过某种方式共同控制了eosio这个账户的权限,并通过eosio这个账户来实现对其他系统账户的控制权。

例子

举个例子,小明想要吃糖(发起更改系统合约的请求),得需要经过小明妈妈的批准(eosio的权限);而小明妈妈,把这个批准权授予了小明爸爸和小明奶奶(出块节点A,出块节点B)。

现在,小明妈妈出去旅游了(eosio这个账户无法直接控制),则,需要经过小明爸爸跟小明奶奶的共同同意,小明吃糖的申请才可以得到批准。

希望借助于此,能够让你有一个大概的理解。下文是翻译自 CryptoLions团队的文章:

https://steemit.com/eos/@cryptolions/the-last-launch-step-how-to-resign-rights-or-eosio-and-manage-the-change-without-them

How do we propose / approve / execute actions after launch without eosio?

主网启动后,没有eosio我们如何发起/批准/执行指令?

Recently we've been testing different approaches to deploy, validate and stress a chain,but little attention was paid to the last steps, how to give up central control, and how to continue administration without central control.
The Main Steps of Launching are these:

最近我们用了多种多样的方式进行部署,验证区块链,进行压力测试,但是却很少关注最后一步,即,如何将中心化的控制权交出,如何在没有中心化控制的情况下,继续进行管理。

启动的主要步骤如下:

  • Run Bios node with fresh genesis and eosio key

  • Deploy BIOS contract with initial producers

  • Create system accounts

  • Deploy eosio.token and eosio.msig contracts

  • Create and issue tokens

  • Deploy system contract and add privileges for eosio.msig

  • Provide distribution RC20 tokens

  • Resign eosio

  • 使用最新的 genesis 文件和 eosio 密钥运行Bios 节点

  • 初始的节点会部署BIOS 合约

  • 创建系统账号

  • 部署系统合约 eosio.token, eosio.msig

  • 创建和发行代币

  • 部署系统合约,为 eosio.msig 增加权限

  • 分发代币

  • 重置 eosio

Resigning eosio means changing rights for account eosio and all other system accounts.

重置 eosio 意味着修改了账户eosio以及所有其他系统账户的权限。

That means that for user eosio, we set permission to eosio.prods@active . This is a system account with a list of active producers. You can check it with

/cleos.sh get account eosio.prods

具体而言,我们把 eosio的权限设定给 eosio.prods@active. 这是一个系统账号,由一组活跃的节点组成,可以用如下的命令查看:

/cleos.sh get account eosio.prods

For all system accounts (eosio.bpay, eosio.msig, eosio.names, eosio.ram, eosio.ramfee, eosio.saving, eosio.stake, eosio.token, eosio.vpay) set permission active and owner permission to account eosio.

把所有系统账户 (eosio.bpay, eosio.msig, eosio.names, eosio.ram, eosio.ramfee, eosio.saving, eosio.stake, eosio.token, eosio.vpay) 的active 权限 和 owner 权限,设定给 eosio 账户.

Example of resign script: https://github.com/CryptoLions/EOS-Boot-Steps-dawn4/blob/master/08_RESIGN.sh

重置(resign) 脚本示例: https://github.com/CryptoLions/EOS-Boot-Steps-dawn4/blob/master/08_RESIGN.sh

After resignation, any changes, transfers, and contract updates can be done by community approval.

重置之后,所有的更改,转账和合约更新,都可以在社区批准之后完成。

How to make a proposal for action without eosio

不用 eosio,如何创建提议指令

Lets do this with an example transaction, proposing to send a tranfer to user “someuser”.

我们来看个转账的例子,提议向用户"someuser"转账。

To make the proposal we will use cleos and multisig propose command.

我们会用到 cleos 程序和 multisig 的propose 命令来创建提议。

This command has these parameters:

有如下参数

proposal_name TEXT          proposal name (string) (required)
requested_permissions TEXT  The JSON string or filename defining requested permissions (required)
rx_permissions TEXT        he JSON string or filename defining transaction permissions (required)
contract TEXT               contract to wich deferred transaction should be delivered (required)
action TEXT                 action of deferred transaction (required)
data TEXT                   The JSON string or filename defining the action to propose (required)
proposer TEXT               Account proposing the transaction
proposal_expiration         Proposal expiration interval in hours

proposal_name TEXT                提议名称 (字符串类型) (必填)
requested_permissions TEXT  定义了请求权限的JSON 字符串或文件名(必填)
rx_permissions TEXT      定义了转账权限的JSON字符串或者文件名(必填)
contract TEXT               延迟交易所用到的智能合约 (必填)
action TEXT                延迟交易所用的指令 (必填)
data TEXT                  定义指令所需要处理内容的 JSON 字符串或者文件名 (required)
proposer TEXT           发起提议的账户
proposal_expiration         提议的过期时长,单位是小时

Since it will be transfer from eosio we need to include all active producers in requested_permissions. To do this lets create simple bash script which will create a list automatically from

需要从账户 eosio 转账,因此我们需要把所有的活跃出块节点都列在 requested_permissions 之中。创建一个简单的bash 脚本,自动创建列表,如下

./cleos.sh get account eosio.prods –j

(Note: We were NOT able to simply use eosio.prods with requested_permissions. We had to generate the list with get account.)

注意: 我们需要先用 get account 命令生成列表之后,才能够使用 eosio.prods。

requestedPermissions="";
#Get list active producers from eosio.prods and building requestedPermissions
PRODUCERS=$(./cleos.sh get account eosio.prods -j)

for row in $(echo "${PRODUCERS}" | jq -r '.permissions[] | @base64'); do
    _jq() {
     echo ${row} | base64 --decode | jq -r ${1}
    }

    perm_name=$(_jq '.perm_name')
    if [ "$perm_name" == "active" ]; then

        data_=$(_jq '.required_auth')
        for accs in $(echo "${data_}" | jq -r '.accounts[] | @base64'); do
                _jq() {
                echo ${accs} | base64 --decode | jq -r ${1}
            }
            account=$(_jq '.permission.actor')
            permission=$(_jq '.permission.permission')

            #bp="$account@$permission"

            # Building requestedPermissions
            requestedPermission='{"actor": "'$account'", "permission": "'$permission'"}'
            if [ "$requestedPermissions" != "" ]; then
                requestedPermissions+=", "
            fi
            requestedPermissions+="$requestedPermission"
        done
        requestedPermissions="[$requestedPermissions]"
        #echo $requestedPermissions
    fi
done

Next, we will make a proposal for transfer (it can be any action to any contract):

接下来,我们发起转账申请的提议(也可以是任何合约的任何指令)

CONTRACT="eosio.token"
ACTION="transfer"
DATA='{"from": "eosio", "to": "someuser", "quantity": "123.0000 EOS", "memo": "compensation"}'

The full command will be:
完整命令如下

./cleos.sh multisig propose "$proposalName" "$requestedPermissions" "$trxPermissions" $CONTRACT $ACTION "$DATA" $proposer $EXPIRATION_IN_H -p $proposer

The full example script which does all of the above is found here: https://github.com/CryptoLions/EOS-Boot-Steps-dawn4/blob/master/16_1_MSIG_TRANSFER_PROPOSE.sh

完整的脚本可以查看如下链接 https://github.com/CryptoLions/EOS-Boot-Steps-dawn4/blob/master/16_1_MSIG_TRANSFER_PROPOSE.sh

Approval

批准

After a proposal is made, block producers from list need to approve this transaction. The number of approvals required is determined by the threshold.

创建了提议之后,列表中的出块节点需要对交易审批。需要经过多少个节点批准,这一数量设定由 threshold 决定。

The approval command is:
批准的命令如下:

./cleos.sh multisig approve $proposer $proposalName "$permissions" -p $ACCOUNT

完整的代码例子见: https://github.com/CryptoLions/EOS-Boot-Steps-dawn4/blob/master/16_2_MSIG_TRANSFER_APPROVE.sh

Execution 执行

After sufficient approvals are made, the transfer can be executed:

得到足够数量的节点批准了提议之后,会执行转账:

./cleos.sh multisig exec $proposer "$proposalName" -p $proposer

例子: https://github.com/CryptoLions/EOS-Boot-Steps-dawn4/blob/master/16_3_MSIG_TRANSFER_EXEC.sh

List Proposals and approvals

列出来所有的提议和已审批通过的提议

You can list all proposals:
可以用如下命令列出所有的申请提议

./cleos.sh get table eosio.msig $ACCOUNT proposal

And all approvals:

用如下命令列出所有审批通过的提议:

./cleos.sh get table eosio.msig $ACCOUNT approvals

We hope this manual was useful for you.

我们希望这一文章对你有用。

All our Bootsteps examples can be found here: https://github.com/CryptoLions/EOS-Boot-Steps-dawn4

我们所拥有的启动步骤的示例,都可以参见: https://github.com/CryptoLions/EOS-Boot-Steps-dawn4

Lastly, we welcome everyone to Jungle testnetwok, to learn and test together: http://jungle.cryptolions.io/

欢迎各位访问 Jungle 测试网络,一起学习和测试:http://jungle.cryptolions.io/

更多联系方式:

http://cryptolions.io/
https://github.com/CryptoLions
https://busy.org/@cryptolions
https://steemit.com/@cryptolions
https://twitter.com/EOS_CryptoLions
https://www.youtube.com/channel/UCB7F-KO0mmZ1yVBCq0_1gtA
Jungle Testnet Monitor: http://jungle.cryptolions.io/
General CryptoLions Chat: https://t.me/block_producer_candidate
Testnet Chat: https://t.me/jungletestnet

推荐阅读更多精彩内容