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。
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"(定義錢包明確)傳參建立另一個錢包。
-
$ cleos wallet create -n periwinkle
使用wallet list命令可以獲取本地所有錢包列表
-
$ cleos wallet list
-
Wallets:
-
[
-
"default *",
-
"periwinkle *"
-
]
注意,當我們錢包被解鎖時,錢包名稱後面都會標記有"*"符號。我們使用"wallet create"生成錢包時,處於方便會預設解鎖我們的錢包。如果對第二個錢包進行加鎖,可以執行"wallet lock"命令:
-
$ cleos wallet lock -n periwinkle
-
Locked: 'periwinkle'
再次執行"wallet list"命令,我們可以看到第二個錢包的"*"符號消失了,這說明該錢包已經加鎖
-
$ cleos wallet list
-
Wallets:
-
[
-
"default *",
-
"periwinkle"
-
]
解鎖一個命名錢包需呼叫"wallet unlock -n",後面跟著錢包名稱。在執行過程中需輸入錢包的私鑰。我們也可以通過在命令列中增加"--password"以及主密碼的傳參,來直接完成私鑰驗證過程,但這樣會導致在console中將金鑰完整的顯示出來。
注:如果我們針對"default"錢包進行加解鎖的操作,則預設的無需使用"-n"傳參指定錢包名稱。
當我們重啟keosd,然後再次通過cleos檢視錢包資訊:
-
$ cleos wallet list
-
"/usr/local/bin/keosd" launched
-
Wallets:
-
[]
注:如果keosd未啟動,在使用cleos第一次與keosd互動時(比如,查詢錢包資訊),就好自動啟動keosd程序。
可以發現此時錢包資訊為空。這是因為錢包在使用之前(包括展示錢包列表)必須首先先開啟錢包。當keosd關閉時,錢包會被鎖定;當keosd被重啟後,錢包並未自動開啟。執行“wallet open”來開啟錢包。
-
$ cleos wallet open
-
$ cleos wallet list
-
Wallets:
-
[
-
"default"
-
]
如果需要開啟其他非預設錢包,則需要新增"-n"來指定錢包名稱進行開啟錢包的操作。
生成和匯出EOSIO密碼
有多種方式可以建立EOSIO的密碼對,但這裡僅僅側重介紹"create key"命令。建立兩組公鑰/私鑰對,留意一下密碼對的通常的格式如下:
-
$cleos create key
-
Private key: 5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE
-
Public key: EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr
-
$cleos create key
-
Private key: 5KYNz1WRZRt9882n1ebA2q5NYQ3oYvzxxAT48i2tyReYHnR49yu
-
Public key: EOS73bzXNHx481Kcg64g4YKS7FxSDYJVYZNiPVZutc3CbXQxW2czc
這些密碼對是隨意的密碼對,並無任何的授權。
接下來的操作,需要確認預設(default)錢包必須是開啟和解鎖狀態的。
cleos指令是可以串聯使用,實現default錢包的開啟與解鎖。甚至只需執行"cleos unlock"即可一步到位實現keosd的開啟、錢包開啟以及解鎖操作。比如執行:
-
$cleos wallet open unlock
-
Opened: default
-
password: Unlocked: default
我們現在使用"wallet import"將私鑰匯入錢包中。
-
$ cleos wallet import 5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE
-
imported private key for: EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr
-
$ cleos wallet import 5KYNz1WRZRt9882n1ebA2q5NYQ3oYvzxxAT48i2tyReYHnR49yu
-
imported private key for: EOS73bzXNHx481Kcg64g4YKS7FxSDYJVYZNiPVZutc3CbXQxW2czc
匯入成功的情況下,cleos會提示正確的公鑰資訊。
我們可以通過輸入“wallet keys”指令,查閱上述資訊。
-
$ cleos wallet keys
-
[[
-
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
-
"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
-
],[
-
"EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr",
-
"5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE"
-
]
-
]
錢包檔案本身是加密的,當錢包加鎖時上述密碼對資訊會得到相應的保護。訪問這些密碼對資訊,需要藉助錢包的密碼。
備份錢包
為防止錢包檔案的損壞,一個良好的習慣是將錢包備份到一個U盤或其他媒介中去。錢包檔案採用高度加密的機制,以確保其中的密碼對難以訪問。
你可以在"data-dir"目錄中找到這些錢包檔案。如果你在啟動eos過程中未指定"--data-dir"引數,你的錢包檔案預設儲存在"~/eosio-wallet"目錄下。
-
$ cd eosio-wallet/
-
$ ll
-
總用量 12
-
-rw-r--r--. 1 root root 1533 5月 28 12:02 config.ini
-
-rw-------. 1 root root 439 5月 28 17:24 default.wallet
-
-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。
-
$ cd ~/eosio-wallet
-
$ vim config.ini
-
# 修改埠為8899,儲存並退出vim
-
$ pkill keosd
-
$ keosd
2. 使用keosd命令列引數
-
$ pkill keosd
-
$ keosd --http-server-address=localhost:8899
或者通過cleos攜帶"--wallet-port=8899"執行錢包操作
$ cleos --wallet-port=8899 wallet unlock
要啟動nodeos,開啟一個終端視窗,找到nodeos可執行檔案所在的目錄,執行:
-
$ cd eos/build/programs/nodeos
-
$ 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}
如果建立成功了,我們將看到反饋以下資訊。
-
executed transaction: 7f1c6b87cd6573365a7bb3c6aa12f8162c3373d57d148f63f2a2d3373ad2fd54 352 bytes 102400 cycles
-
# 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 | 將數字幣從一個賬號轉賬到另一個賬號 |