eos源碼解析(十):從更新系統(tǒng)合約看手動(dòng)簽名

更新系統(tǒng)合約的步驟:https://developers.eos.io/eosio-cpp/docs/upgrading-the-system-contract
  eos的更新合約,使用的是set命令,這個(gè)命令會(huì)打包一個(gè)transaction。實(shí)際上,cleos執(zhí)行某個(gè)步驟最終都是把這個(gè)步驟打包成transaction。每個(gè)transaction中包含一個(gè)或者多個(gè)action,比如set命令的transaction就會(huì)包含setcode和setabi兩個(gè)action。
  官方提供的系統(tǒng)合約更新需要15個(gè)主節(jié)點(diǎn)的簽名,采用手動(dòng)的方法。更新系統(tǒng)合約,需要eosio的權(quán)限:

cleos -u http://api.hkeos.com get account eosio
privileged: true
permissions: 
     owner     1:    1 eosio.prods@active, 
        active     1:    1 eosio.prods@active

Plain Text
cleos -u http://api.hkeos.com get account eosio.prods
permissions: 
     owner     1:    
        active    15:    1 argentinaeos@active, 1 bitfinexeos1@active, 1 cypherglasss@active, 1 eos42freedom@active, 1 eosasia11111@active, 1 eosauthority@active, 1 eoscanadacom@active, 1 eoscannonchn@active, 1 eosdacserver@active, 1 eosfishrocks@active, 1 eosflytomars@active, 1 eoshuobipool@active, 1 eoslaomaocom@active, 1 eosnewyorkio@active, 1 eosriobrazil@active, 1 eosswedenorg@active, 1 jedaaaaaaaaa@active, 1 libertyblock@active, 1 starteosiobp@active, 1 teamgreymass@active, 1 zbeosbp11111@active

從上文分析,既然transaction的原理都是一樣的,那么,如果使用手動(dòng)簽名簽署一筆多重簽名的交易,在原理上和修改系統(tǒng)合約是一致的。
兩個(gè)賬戶,hello.code 和 user,他們的原始狀態(tài)如下:

cleos get account hello.code
permissions: 
     owner     1:    1 EOS8bD3vL8QjLuiaHg3ucZYfsYW8HabyFErSYdVmtSr5tQ4ahP3Kd
        active     1:    1 EOS8bD3vL8QjLuiaHg3ucZYfsYW8HabyFErSYdVmtSr5tQ4ahP3Kd
.......
SYS balances: 
     liquid:           20.0000 SYS
     staked:            0.0000 SYS
     unstaking:         0.0000 SYS
     total:            20.0000 SYS
cleos get account user
permissions: 
     owner     1:    1 EOS7MMGNnXmyuyXZh7cmZgU66rGrJ56AcyrWFzmc6zdi6VEpcRhCd
        active     2:    1 EOS7MMGNnXmyuyXZh7cmZgU66rGrJ56AcyrWFzmc6zdi6VEpcRhCd1 hello.code@active, 
.......
SYS balances: 
     liquid:           80.0000 SYS
     staked:            0.0000 SYS
     unstaking:         0.0000 SYS
     total:            80.0000 SYS

hello.code使用單簽,公鑰是:EOS8bD3vL8QjLuiaHg3ucZYfsYW8HabyFErSYdVmtSr5tQ4ahP3Kd
user使用多重簽名,active權(quán)限的權(quán)限權(quán)重是:
1 EOS7MMGNnXmyuyXZh7cmZgU66rGrJ56AcyrWFzmc6zdi6VEpcRhCd
1 hello.code@active
實(shí)驗(yàn)?zāi)繕?biāo):從user賬戶轉(zhuǎn)入hello.code賬戶10SYS
Plain Text
cleos transfer -j -d -s user hello.code '10 SYS' '' >tr.json
得到:

{
  "expiration": "2018-09-03T06:47:07",
  "ref_block_num": 46384,
  "ref_block_prefix": 2713986768,
  "max_net_usage_words": 0,
  "max_cpu_usage_ms": 0,
  "delay_sec": 0,
  "context_free_actions": [],
  "actions": [{
      "account": "eosio.token",
      "name": "transfer",
      "authorization": [{
          "actor": "user",
          "permission": "active"
        }
      ],
      "data": "00000000007015d600804a14011aa36aa086010000000000045359530000000000"
    }
  ],
  "transaction_extensions": [],
  "signatures": [],
  "context_free_data": []
}

修改expiration字段: "expiration": "2018-09-03T07:47:07"

公私鑰對(duì)為:
Private key1: 5K2pvJeJiGgqFQ2b7NhZNsphgUmyge1sEY8oA18zyRJBrDzXwm3
Public key1: EOS8bD3vL8QjLuiaHg3ucZYfsYW8HabyFErSYdVmtSr5tQ4ahP3Kd

Private key2: 5JVNQ8mwcF1qJcF9QsFfcrqYFbj785xAL2mXEnyN5fNYE56wwbC
Public key2: EOS7MMGNnXmyuyXZh7cmZgU66rGrJ56AcyrWFzmc6zdi6VEpcRhCd
使用Private key1簽名:
cleos sign tr.json
得到:

{
  "expiration": "2018-09-03T07:47:07",
  "ref_block_num": 46384,
  "ref_block_prefix": 2713986768,
  "max_net_usage_words": 0,
  "max_cpu_usage_ms": 0,
  "delay_sec": 0,
  "context_free_actions": [],
  "actions": [{
      "account": "eosio.token",
      "name": "transfer",
      "authorization": [{
          "actor": "user",
          "permission": "active"
        }
      ],
      "data": "00000000007015d600804a14011aa36aa086010000000000045359530000000000"
    }
  ],
  "transaction_extensions": [],
  "signatures": [
    "SIG_K1_K7PAA2JCbVEg2jxRQLiSTDF7wonXmNcewbTqq7EiEKv2e711FzteLBVG81R7NhKgZ2LSWGL5ruDUCXSXiZmo6yf9K6aM5D"
  ],
  "context_free_data": []
}

提取signatures字段:
  "SIG_K1_KdKWuceUCGVSgQcCdsztLJZGEuLzDabraL1Ck83cJ81jLkRM9nSi8YKA1dZ2LnVcN3DJco5ZWcJvnTkzdEDeTeifuVJT4w"
使用Private key2簽名:
cleos sign tr.json
得到:
  "SIG_K1_K7PAA2JCbVEg2jxRQLiSTDF7wonXmNcewbTqq7EiEKv2e711FzteLBVG81R7NhKgZ2LSWGL5ruDUCXSXiZmo6yf9K6aM5D"
將兩個(gè)簽名復(fù)制到tr.json中,更改signatures字段:

{
  "expiration": "2018-09-03T07:47:07",
  "ref_block_num": 46384,
  "ref_block_prefix": 2713986768,
  "max_net_usage_words": 0,
  "max_cpu_usage_ms": 0,
  "delay_sec": 0,
  "context_free_actions": [],
  "actions": [{
      "account": "eosio.token",
      "name": "transfer",
      "authorization": [{
          "actor": "user",
          "permission": "active"
        }
      ],
      "data": "00000000007015d600804a14011aa36aa086010000000000045359530000000000"
    }
  ],
  "transaction_extensions": [],
  "signatures": ["SIG_K1_KdKWuceUCGVSgQcCdsztLJZGEuLzDabraL1Ck83cJ81jLkRM9nSi8YKA1dZ2LnVcN3DJco5ZWcJvnTkzdEDeTeifuVJT4w" , "SIG_K1_K7PAA2JCbVEg2jxRQLiSTDF7wonXmNcewbTqq7EiEKv2e711FzteLBVG81R7NhKgZ2LSWGL5ruDUCXSXiZmo6yf9K6aM5D"],
  "context_free_data": []
}

將交易發(fā)送給區(qū)塊鏈:
  cleos push transaction --skip-sign tr.json
-->Error 3080006: Transaction took too long
重復(fù)幾次
-->

{
  "transaction_id": "af082f5cdc4261cbbc113cea4d4f78270c3eff93b9672ac1f2fcc91ffc5e8bc1",
  "processed": {
    "id": "af082f5cdc4261cbbc113cea4d4f78270c3eff93b9672ac1f2fcc91ffc5e8bc1",
    "receipt": {
      "status": "executed",
      "cpu_usage_us": 955,
      "net_usage_words": 18
    },
    "elapsed": 955,
    "net_usage": 144,
    "scheduled": false,
    "action_traces": [{
        "receipt": {
          "receiver": "eosio.token",
          "act_digest": "6c35053af65c3921c72659794660bacf062706fd21fcb3e2373616958d09c4c6",
          "global_sequence": 47921,
          "recv_sequence": 6,
          "auth_sequence": [[
              "user",
              8
            ]
          ],
          "code_sequence": 1,
          "abi_sequence": 1
        },
        "act": {
          "account": "eosio.token",
          "name": "transfer",
          "authorization": [{
              "actor": "user",
              "permission": "active"
            }
          ],
          "data": {
            "from": "user",
            "to": "hello.code",
            "quantity": "10.0000 SYS",
            "memo": ""
          },
          "hex_data": "00000000007015d600804a14011aa36aa086010000000000045359530000000000"
        },
        "elapsed": 823,
        "cpu_usage": 0,
        "console": "",
        "total_cpu_usage": 0,
        "trx_id": "af082f5cdc4261cbbc113cea4d4f78270c3eff93b9672ac1f2fcc91ffc5e8bc1",
        "inline_traces": [{
            "receipt": {
              "receiver": "user",
              "act_digest": "6c35053af65c3921c72659794660bacf062706fd21fcb3e2373616958d09c4c6",
              "global_sequence": 47922,
              "recv_sequence": 4,
              "auth_sequence": [[
                  "user",
                  9
                ]
              ],
              "code_sequence": 1,
              "abi_sequence": 1
            },
            "act": {
              "account": "eosio.token",
              "name": "transfer",
              "authorization": [{
                  "actor": "user",
                  "permission": "active"
                }
              ],
              "data": {
                "from": "user",
                "to": "hello.code",
                "quantity": "10.0000 SYS",
                "memo": ""
              },
              "hex_data": "00000000007015d600804a14011aa36aa086010000000000045359530000000000"
            },
            "elapsed": 9,
            "cpu_usage": 0,
            "console": "",
            "total_cpu_usage": 0,
            "trx_id": "af082f5cdc4261cbbc113cea4d4f78270c3eff93b9672ac1f2fcc91ffc5e8bc1",
            "inline_traces": []
          },{
            "receipt": {
              "receiver": "hello.code",
              "act_digest": "6c35053af65c3921c72659794660bacf062706fd21fcb3e2373616958d09c4c6",
              "global_sequence": 47923,
              "recv_sequence": 3,
              "auth_sequence": [[
                  "user",
                  10
                ]
              ],
              "code_sequence": 1,
              "abi_sequence": 1
            },
            "act": {
              "account": "eosio.token",
              "name": "transfer",
              "authorization": [{
                  "actor": "user",
                  "permission": "active"
                }
              ],
              "data": {
                "from": "user",
                "to": "hello.code",
                "quantity": "10.0000 SYS",
                "memo": ""
              },
              "hex_data": "00000000007015d600804a14011aa36aa086010000000000045359530000000000"
            },
            "elapsed": 9,
            "cpu_usage": 0,
            "console": "",
            "total_cpu_usage": 0,
            "trx_id": "af082f5cdc4261cbbc113cea4d4f78270c3eff93b9672ac1f2fcc91ffc5e8bc1",
            "inline_traces": []
          }
        ]
      }
    ],
    "except": null
  }
}

然后cleos --url http://localhost:8888 get transaction af082f5cdc4261cbbc113cea4d4f78270c3eff93b9672ac1f2fcc91ffc5e8bc1
總是報(bào)錯(cuò),不知為何,但從結(jié)果上看:
報(bào)錯(cuò)的原因是數(shù)據(jù)并沒有存放進(jìn)磁盤,在啟動(dòng)nodeos時(shí)加入--filter-on=*即可。此時(shí)數(shù)據(jù)庫只會(huì)存放重新啟動(dòng)之后的交易,猜想應(yīng)該強(qiáng)制重新播放塊可以解決。

cleos get account hello.code
permissions: 
     owner     1:    1 EOS8bD3vL8QjLuiaHg3ucZYfsYW8HabyFErSYdVmtSr5tQ4ahP3Kd
        active     1:    1 EOS8bD3vL8QjLuiaHg3ucZYfsYW8HabyFErSYdVmtSr5tQ4ahP3Kd
......
SYS balances: 
     liquid:           30.0000 SYS
     staked:            0.0000 SYS
     unstaking:         0.0000 SYS
     total:            30.0000 S

hello.code的資金增加了10SYS
user的資金減少了10SYS
結(jié)果是正確的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容