1. 程式人生 > >EOS學習之路004--EOS的賬戶系統

EOS學習之路004--EOS的賬戶系統

比特幣和以太坊只有私鑰和地址的概念,而EOS賬戶可以是使用者自定義的字串[12個],但是EOS的賬戶需要付費才能建立,不像比特幣、ETH,

EOS賬戶的功能: 1.每個賬戶可以傳送結構化的訊息給任意其他賬戶 2.每個賬戶可以定義處理訊息的指令碼 3.訊息處理指令碼也可以給其他賬戶發訊息 4.每個賬戶有自己的私有資料庫 5.最終訊息和訊息處理指令碼就是EOS的智慧合約

有了賬戶就可以通過角色、許可權控制來管理,也可以通過合理的許可權控制來管理賬戶.

EOS為許可權級別進行了命名比如說Owner、Active、Friend。這些命名可以是系統預設的比如Owner和Active,有些是可以自定義的比如Friend的。

可以將某個訊息處理群組分配到某個許可權級別上,或者反過來說,可以在某個許可權級別上定義很多訊息處理群組。 舉個例子:一個帳戶所有者可以將自己社交媒體應用與自己的“朋友”許可權群組建立對映。 有了這個對映,任何朋友可以以這一帳戶的身份在這一帳戶的社交媒體上發帖。 儘管他們將以帳戶所有者的身份發帖,他們仍然使用自己的金鑰來簽名訊息。如何進行許可權評估,簡單的來講就是從小到大進行逐級匹配,比如:當 @alice 以 "Action" 型別傳送一條訊息給 @bob 時,首先會檢查 @alice 是否為 @bob.groupa.subgroup.Action 定義過許可權對映。 如果什麼都沒有找到,緊接著檢查 @bob.groupa.subgroup 對映,然後是 @bob.groupa,最後 @bob 將被檢查。 如果都沒有找到,那麼假定對映為命名的許可權群組 @alice.active。

一旦一個對映被識別,則使用相關聯的簽名驗證許可權。 如果失敗了,則躍遷至父許可權,直至擁有者許可權@alice.owner

EOS的預設許可權群組,預設的許可權組上面我們也有講到,是Owner和Active,Owner可以做任何事情,這個許可權一般來說不用來做具體的工作,一般用來做冷備份,比如說Active許可權丟了,就可以是用Owner許可權來恢復。 Active許可權可以做除了修改Owner以外的所有事情,一般業務都是有Active許可權來完成。其他的所有許可權組也都是從Active許可權派生出來的。

EOS允許有時間延時的訊息,在特別的時間範圍內可以取消訊息。這點是比特幣和以太坊不能實現的,特別是在網路擁堵的情況下,若手續費比較低,往往一筆交易很長時間得不到確認,而使用者完全沒有辦法取消交易。這種延時訊息具體延時多長時間完全有訊息的敏感程度決定,比如說買咖啡可能是幾秒鐘,買房可能是幾天,轉移整個賬戶可能是一個月,確切的時間取決於應用開發者和使用者

EOS允許恢復被盜竊的金鑰,這在比特幣和以太坊上是不可能的,在比特幣和以太坊上一旦金鑰丟失那麼整個賬戶也隨之丟失,EOS提供了恢復金鑰的機制。具體來說就是可以使用30天內的任意Owner許可權的金鑰,注意這個金鑰可能已經被黑客換過了,但是在這個場景下這個金鑰還是可以使用的;使用任意30天內的Owner金鑰和指定的合作伙伴才能恢復金鑰。這裡面合作伙伴不能在沒有Owner協助的基礎上恢復金鑰。合作伙伴也不會參與任何日常交易,這樣可以大大降低法律上的風險。

錢包用來儲存一組公鑰-私鑰的對。這些金鑰對將參與區塊鏈的上的操作簽名。keosd管理著錢包和其中的內容。我們通過cleos來使用這些錢包。

一個賬戶可視為線上的訪問憑證。nodeos管理著在區塊鏈上釋出賬戶以及與賬戶相關聯的行為。我們通過cleos與nodeos的互動,來實現賬戶的管理。

錢包與賬戶之間沒有天然的內在聯絡。賬戶並不知道錢包的存在,反之錢包也不知道賬戶的存在。所以,nodeos與keosd之間也沒有內在的關聯。他們(nodeos與keosd)基礎函式是有著本質的不同。(在部署配置過程中可能會模糊化他們之間的區別,所以在這裡特別提醒下)

在對一個交易進行簽名時,nodeos與keosd之間會發生互動。錢包通過將鎖定的鍵值本地化儲存的方式,實現以安全的方式活動簽名。cleos作為一箇中介,實現keosd(從本地獲取)鍵值到nodeos使用這些鍵進行賬戶(以及其他)區塊鏈簽名相關的操作。

建立和管理錢包

使用cleos的"wallet create"命令:

$ cleos wallet create

此時keosd中建立了稱之為“default”(預設)的錢包,並提示密碼(mater password)。該密碼是用來解鎖(解密)你的錢包檔案,請務必妥善保管。

錢包檔案被命名為"deafult.wallet"。預設情況下,keosd將此檔案儲存在"~/eosio-wallet"目錄下。這個目錄可以通過在keosd命令列中新增"--data-dir"引數來指定。

管理多個錢包和錢包名稱

cleos可以用來管理多個錢包。每個不同的錢包都通過不同的錢包密碼進行保護。下面的例子將展示如何通過"-n"(定義錢包明確)傳參建立另一個錢包。

  1. $ cleos wallet create -n periwinkle

使用wallet list命令可以獲取本地所有錢包列表

  1. $ cleos wallet list

  2. Wallets:

  3. [

  4. "default *",

  5. "periwinkle *"

  6. ]

注意,當我們錢包被解鎖時,錢包名稱後面都會標記有"*"符號。我們使用"wallet create"生成錢包時,處於方便會預設解鎖我們的錢包。如果對第二個錢包進行加鎖,可以執行"wallet lock"命令:

  1. $ cleos wallet lock -n periwinkle

  2. Locked: 'periwinkle'

再次執行"wallet list"命令,我們可以看到第二個錢包的"*"符號消失了,這說明該錢包已經加鎖

  1. $ cleos wallet list

  2. Wallets:

  3. [

  4. "default *",

  5. "periwinkle"

  6. ]

解鎖一個命名錢包需呼叫"wallet unlock -n",後面跟著錢包名稱。在執行過程中需輸入錢包的私鑰。我們也可以通過在命令列中增加"--password"以及主密碼的傳參,來直接完成私鑰驗證過程,但這樣會導致在console中將金鑰完整的顯示出來。

注:如果我們針對"default"錢包進行加解鎖的操作,則預設的無需使用"-n"傳參指定錢包名稱。

當我們重啟keosd,然後再次通過cleos檢視錢包資訊:

  1. $ cleos wallet list

  2. "/usr/local/bin/keosd" launched

  3. Wallets:

  4. []

注:如果keosd未啟動,在使用cleos第一次與keosd互動時(比如,查詢錢包資訊),就好自動啟動keosd程序。

可以發現此時錢包資訊為空。這是因為錢包在使用之前(包括展示錢包列表)必須首先先開啟錢包。當keosd關閉時,錢包會被鎖定;當keosd被重啟後,錢包並未自動開啟。執行“wallet open”來開啟錢包。

  1. $ cleos wallet open

  2. $ cleos wallet list

  3. Wallets:

  4. [

  5. "default"

  6. ]

如果需要開啟其他非預設錢包,則需要新增"-n"來指定錢包名稱進行開啟錢包的操作。

生成和匯出EOSIO密碼

有多種方式可以建立EOSIO的密碼對,但這裡僅僅側重介紹"create key"命令。建立兩組公鑰/私鑰對,留意一下密碼對的通常的格式如下:

  1. $cleos create key

  2. Private key: 5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE

  3. Public key: EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr

  4. $cleos create key

  5. Private key: 5KYNz1WRZRt9882n1ebA2q5NYQ3oYvzxxAT48i2tyReYHnR49yu

  6. Public key: EOS73bzXNHx481Kcg64g4YKS7FxSDYJVYZNiPVZutc3CbXQxW2czc

這些密碼對是隨意的密碼對,並無任何的授權。

接下來的操作,需要確認預設(default)錢包必須是開啟和解鎖狀態的。

cleos指令是可以串聯使用,實現default錢包的開啟與解鎖。甚至只需執行"cleos unlock"即可一步到位實現keosd的開啟、錢包開啟以及解鎖操作。比如執行:

  1. $cleos wallet open unlock

  2. Opened: default

  3. password: Unlocked: default

我們現在使用"wallet import"將私鑰匯入錢包中

  1. $ cleos wallet import 5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE

  2. imported private key for: EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr

  3. $ cleos wallet import 5KYNz1WRZRt9882n1ebA2q5NYQ3oYvzxxAT48i2tyReYHnR49yu

  4. imported private key for: EOS73bzXNHx481Kcg64g4YKS7FxSDYJVYZNiPVZutc3CbXQxW2czc

匯入成功的情況下,cleos會提示正確的公鑰資訊。

我們可以通過輸入“wallet keys”指令,查閱上述資訊。

  1. $ cleos wallet keys

  2. [[

  3. "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",

  4. "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"

  5. ],[

  6. "EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr",

  7. "5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE"

  8. ]

  9. ]

錢包檔案本身是加密的,當錢包加鎖時上述密碼對資訊會得到相應的保護。訪問這些密碼對資訊,需要藉助錢包的密碼。

備份錢包

為防止錢包檔案的損壞,一個良好的習慣是將錢包備份到一個U盤或其他媒介中去。錢包檔案採用高度加密的機制,以確保其中的密碼對難以訪問。

你可以在"data-dir"目錄中找到這些錢包檔案。如果你在啟動eos過程中未指定"--data-dir"引數,你的錢包檔案預設儲存在"~/eosio-wallet"目錄下。

  1. $ cd eosio-wallet/

  2. $ ll

  3. 總用量 12

  4. -rw-r--r--. 1 root root 1533 5月  28 12:02 config.ini

  5. -rw-------. 1 root root  439 5月  28 17:24 default.wallet

  6. -rw-------. 1 root root  311 5月  28 16:19 periwinkle.wallet

可以將上述*.wallet檔案拷貝出來,儲存在安全的媒介中。

建立一個賬號

在區塊鏈上執行操作,需要使用到賬號。我們使用cleos向nodeos發起請求來建立賬號並且將賬號釋出到區塊鏈中。在執行建立賬號操作之前,我們必須確保nodeos處於執行狀態。在後面的例子中,我們需要在一臺機器上同時執行keosd和nodeos兩個程序,而上述兩個程序預設配置的埠都是8888,因此需要進行簡單修改確保keosd和nodeos執行在不同埠上。

通常有兩種方式可以將keosd的埠改為8899:

1. 進入錢包檔案所在的目錄,並將config.ini檔案中的埠改為8899,儲存配置檔案並重啟keosd。

  1. $ cd ~/eosio-wallet

  2. $ vim config.ini

  3. # 修改埠為8899,儲存並退出vim

  4. $ pkill keosd

  5. $ keosd

2. 使用keosd命令列引數

  1. $ pkill keosd

  2. $ keosd --http-server-address=localhost:8899

或者通過cleos攜帶"--wallet-port=8899"執行錢包操作

$ cleos --wallet-port=8899 wallet unlock

要啟動nodeos,開啟一個終端視窗,找到nodeos可執行檔案所在的目錄,執行:

  1. $ cd eos/build/programs/nodeos

  2. $ nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin

現在我們可以使用"cleos create account"建立一個賬號了。

$ cleos create account ${authorizing_account} ${new_account} ${owner_key} ${active_key}
  • authorizing_account: 授權的賬號名稱,用來支付賬號建立以及後續其他新賬號的費用。

  • new_account:希望建立的新賬號

  • owner_key:擁有擁有者許可權的賬號的公鑰

  • active_key:希望分配給活躍許可權公鑰

在這裡,“eosio”是一個可授權賬號。當在區塊鏈上進行操作時必須使用eosio賬號進行簽名。eosio賬號同時還是特殊的賬號用來啟動EOSIO節點,它的密碼對資訊資訊可以在nodeos的配置檔案中找到(預設在 "~/.local/shared/eosio/config/config.ini").

我們需要為新賬號定一個名稱。賬號名稱必須遵循以下兩個準則:

  • 必須短於13個字元

  • 僅能包含以下字元:.12345abcdefghijklmnopqrstuvwxyz

我們採用“myaccount”作為新賬號名稱。

我們使用上面匯入到錢包中的公鑰(以"EOS"開頭的字串),這些公鑰在未授權之前是隨意的賬號。這些賬號一旦授權,這些賬號就會變得異常重要。擁有者的金鑰(owner key)擁有賬號最高許可權,而活躍許可權賬號(active key)將擁有使用賬號資金的權利。

使用"cleos create account"來建立我們的賬號。

$ cleos --wallet-port=8899 create account eosio myaccount ${public_key_1} ${public_key_2}

如果建立成功了,我們將看到反饋以下資訊。

  1. executed transaction: 7f1c6b87cd6573365a7bb3c6aa12f8162c3373d57d148f63f2a2d3373ad2fd54  352 bytes  102400 cycles

  2. #         eosio <= eosio::newaccount            {"creator":"eosio","name":"myaccount","owner":{"threshold":1,"keys":[{"key":"EOS5kkAs8HZ88m2N7iZWy4J...

賬號相關操作

使用cleos還可以針對賬號進行以下操作。

cleos命令 描述
create account 在區塊鏈上建立新賬號
get account 從區塊鏈上獲取一個賬號
get code 查詢一個賬號的程式碼和ABI
get accounts 查詢與一個公鑰關聯的賬號資訊
get servants 查詢一個給定賬號之下的服務賬號
get transactions 查詢與一個賬號關聯的所有的交易
set contract 使用一個賬號建立或修改合約
set account 設定或修改區塊鏈上賬號的狀態
transfer 將數字幣從一個賬號轉賬到另一個賬號