1. 程式人生 > >第9課 如何變更EOS賬號的active key和owner key?

第9課 如何變更EOS賬號的active key和owner key?

1,摘要

【本文目標】 通過本文學習,可以通過EOS本地環境完成EOS註冊賬號的active key和owner key的變更。 在EOS賬號是其他人代為註冊時,私鑰往往也被其他人知曉,存在洩漏風險,建議儘快完成變更。

【技術收穫】 1) cleos set account permission的使用;

2. 實踐操作

承接上一課的故事,戈壁創投的徐晨總請輝哥註冊個他們公司同名的EOS賬號(例如:gobipartners)。 近期,戈壁創投決定要投資某個優質區塊鏈專案,準備往gobipartners賬號打100萬個EOS,作為區塊鏈投資轉賬總出口賬號。徐總突然想起,gobipartners賬號的私鑰也是輝哥建立的,他可能也保留著該賬戶的私鑰記錄,嚇出了一身冷汗。 現在徐晨總也知道可以通過一些錢包生成金鑰對,這個金鑰對只有他自己知曉。

2.1 通過TokenPocket錢包建立金鑰對

通過TokenPocket官網下載錢包版本。 安裝後,通過 發現 > EOS助手 > 賬號註冊 > 密碼生成器 完成金鑰對的生成。

2.2 金鑰匯入

徐總來到輝哥的本地EOS環境,讓輝哥背過身,親自把私鑰匯入輝哥的duncanwang本地錢包。 【說明】此步操作可以在別的任意EOS開發環境完成匯入工作。

cleos wallet import <新的私鑰> -n duncanwang

2.3 許可權變更

1) 檢視gobipartners賬號資訊

輸出結果表明 owner key 和 active key還是輝哥的金鑰對。

[email protected]:~$ cleos -u https://node1.eoscannon.io get  account gobipartners
permissions: 
     owner     1:    1 EOS8gaYL4uHyAiZjviwNJ8CdY31xikYtQfexyUfkNUnDqhNpnYXQR
        active     1:    1 EOS8gaYL4uHyAiZjviwNJ8CdY31xikYtQfexyUfkNUnDqhNpnYXQR
memory: 
     quota:     7.959 KiB    used:     2.926 KiB  

net bandwidth: 
     delegated:       0.1000 EOS           (total staked delegated to account from others)
     used:                 0 bytes
     available:        55.92 KiB  
     limit:            55.92 KiB  

cpu bandwidth:
     delegated:       0.1000 EOS           (total staked delegated to account from others)
     used:                 0 us   
     available:         10.9 ms   
     limit:             10.9 ms

2.4 變更賬戶active許可權為徐總公鑰

假設徐總產生的公鑰Public key如下:EOS7Rq86JcZLgPXwZKRGPYUnLayBy7NcBV7FBE7gSNCW3HmGApK9V 命令格式:

cleos set account permission <轉讓賬戶名> active ‘{“threshold”:1,“keys”:[{“key”:"<對方公鑰>",“weight”:1}]}’ owner

輸出結果:

[email protected]:~$ cleos -u https://node1.eoscannon.io set account permission gobipartners active '{"threshold":1,"keys":[{"key":"EOS7Rq86JcZLgPXwZKRGPYUnLayBy7NcBV7FBE7gSNCW3HmGApK9V","weight":1}]}' owner
executed transaction: 0b7ab9fe92413e6b4b5d25578afdef81438c73adac015972ce56f59c570034e9  160 bytes  1317 us
#         eosio <= eosio::updateauth            {"account":"gobipartners","permission":"active","parent":"owner","auth":{"threshold":1,"keys":[{"key...
warning: transaction executed locally, but may not be confirmed by the network yet

查詢確認active的KEY已發生變更:

[email protected]:~$ cleos -u https://node1.eoscannon.io get  account gobipartners
permissions: 
     owner     1:    1 EOS8gaYL4uHyAiZjviwNJ8CdY31xikYtQfexyUfkNUnDqhNpnYXQR
        active     1:    1 EOS7Rq86JcZLgPXwZKRGPYUnLayBy7NcBV7FBE7gSNCW3HmGApK9V
memory: 
     quota:     7.959 KiB    used:     2.926 KiB  

net bandwidth: 
     delegated:       0.1000 EOS           (total staked delegated to account from others)
     used:               161 bytes
     available:        55.76 KiB  
     limit:            55.92 KiB  

cpu bandwidth:
     delegated:       0.1000 EOS           (total staked delegated to account from others)
     used:             1.122 ms   
     available:        9.779 ms   
     limit:             10.9 ms  

2.5 變更賬戶owner為徐總公鑰

命令格式:

cleos set account permission <轉讓賬戶名> owner ‘{“threshold”:1,“keys”:[{“key”:"<對方公鑰>",“weight”:1}]}’ -p <轉讓賬戶名>@owner

輸出結果:

[email protected]:~$ cleos -u https://node1.eoscannon.io set account permission -x 120 gobipartners owner '{"threshold":1,"keys":[{"key":"EOS7Rq86JcZLgPXwZKRGPYUnLayBy7NcBV7FBE7gSNCW3HmGApK9V","weight":1}]}' -p [email protected]
executed transaction: ed1593fee153baa7b02e1e3e1155e732c3e7db4fbb3fd50ff73b0de1a04d5831  160 bytes  1186 us
#         eosio <= eosio::updateauth            {"account":"gobipartners","permission":"owner","parent":"","auth":{"threshold":1,"keys":[{"key":"EOS...
warning: transaction executed locally, but may not be confirmed by the network yet

【問題】 輸入命令提示錯誤,資訊如下:

[email protected]:~$ cleos set account permission gobipartners owner '{"threshold":1,"keys":[{"key":"EOS7Rq86JcZLgPXwZKRGPYUnLayBy7NcBV7FBE7gSNCW3HmGApK9V","weight":1}]}' -p [email protected]
Error 3090003: provided keys, permissions, and delays do not satisfy declared authorizations
Ensure that you have the related private keys inside your wallet and your wallet is unlocked.

初步估計是跟主網節點連線處理的時間不夠,增加-x 120,把等待時間改為2分鐘,就成功了。

查詢確認owner的KEY已發生變更:

[email protected]:~$ cleos -u https://node1.eoscannon.io get  account gobipartners
permissions: 
     owner     1:    1 EOS7Rq86JcZLgPXwZKRGPYUnLayBy7NcBV7FBE7gSNCW3HmGApK9V
        active     1:    1 EOS7Rq86JcZLgPXwZKRGPYUnLayBy7NcBV7FBE7gSNCW3HmGApK9V
memory: 
     quota:     7.959 KiB    used:     2.926 KiB  

net bandwidth: 
     delegated:       0.1000 EOS           (total staked delegated to account from others)
     used:               318 bytes
     available:        55.61 KiB  
     limit:            55.92 KiB  

cpu bandwidth:
     delegated:       0.1000 EOS           (total staked delegated to account from others)
     used:             1.628 ms   
     available:        9.273 ms   
     limit:             10.9 ms   

3, 賬戶owner和active許可權定義

3.1 原生許可權-owner和active許可權

EOS中,每個賬戶建立時會自帶兩個原生許可權:owner和active許可權。這也是預設的賬戶許可權配置。 owner許可權 owner即代表賬戶所有權,該許可權可進行所有操作,包括更改owner許可權,可由一對或多對EOS公私鑰或另一賬戶的某許可權實現許可權控制。因此,代表著owner許可權的EOS公私鑰是最重要的,必須冷儲藏保管好。 active許可權 active即活躍許可權,能進行除更改owner許可權以外的所有操作,也是通過一對或多對EOS公私鑰或另一賬戶的某許可權實現許可權控制。

3.2 自定義許可權

除了兩個原生許可權以外,EOS還支援自定義許可權。active許可權可以看作是owner許可權將除更改owner許可權以外的所有許可權都任命給了它,比如說轉賬、投票、購買ram等等。然後基於active許可權,我們可以將active的部分許可權,比如說投票權,任命給一個自定義許可權voting。那麼無須owner、active許可權所對應的私鑰對投票操作進行簽名,單單通過voting許可權所對應的私鑰對投票操作進行簽名便可完成投票操作。這就可以將EOS賬戶的部分操作許可權分配給第三方進行,避免了直接給出active許可權的私鑰,從而實現極其靈活和安全的組織管理方式。

3.3 權重和閾值

在多主體共同控制某一許可權的情況下(如多對EOS公私鑰共同控制owner許可權),如何判定,或者說在何種條件下就擁有了該賬戶的某一許可權?EOS是通過權重和閾值來實現的。賬戶可給每個主體(如每對EOS公私鑰)分配不同的權重,以及擁有該許可權的閾值,只有當某些人擁有的公私鑰數量所對應的權重之和不低於該許可權的閾值,才能擁有該許可權,進行相應操作。以下列某賬戶的許可權配置為例進行詳細說明:

其中,該賬戶的owner許可權由擁有【EOS2Ca4o…】和【EOS3Q3bx…】公鑰所對應私鑰的人共同控制,任何一方都不能單獨擁有owner許可權。因為雙方的權重都為50,而owner許可權的閾值為100,因此只有雙方達成一致,一起對交易進行簽名才能行使owner許可權。 而active許可權則可由【EOS94x3b…】和【EOS4x112…】任意一方單獨行使。 對於自定義許可權voting,擁有【EOS7Hn1p…】公鑰所對應私鑰的人可單獨行使,而賬戶【testaccount1】則需和賬戶【testaccount2】通過各自的active許可權結合起來才能共同行使該賬戶的voting許可權。

4,參考

本故事純屬虛構,輝哥還沒有跟徐晨總建立聯絡。但是戈壁創投的EOS帳號已註冊好了,如有需要可轉讓給徐總。