手把手教你使用EOS多重簽名保護(hù)你的資產(chǎn)區(qū)塊鏈
使用OpenBlockchain系統(tǒng),我們需要具備保護(hù)自己資產(chǎn)的能力,因?yàn)檫@個(gè)系統(tǒng)不具備掛失、凍結(jié)、回滾等功能。這篇文章的目的,就是在BM的團(tuán)隊(duì)做出基于iPhone的硬件錢(qián)包之前,教你如何在去中心化的世界里保護(hù)自己的財(cái)產(chǎn)。
最近頻繁曝出用戶 EOS 被盜的事件,作為一個(gè)剛上線才 1 個(gè)多月的項(xiàng)目,在各種設(shè)施都不太齊全的情況下,這種新聞一旦流出,都會(huì)讓人感到 FUD(Fear、Uncertainty、Doubt),不僅你會(huì)怕,我也怕,我會(huì)想 XX 錢(qián)包會(huì)不會(huì)偷偷把私鑰上傳到服務(wù)器了?如果是這樣,我會(huì)不會(huì)被中間人攻擊啊?它們的服務(wù)器會(huì)不會(huì)被拖庫(kù)啊?我的剪切板不會(huì)也被某某軟件監(jiān)聽(tīng)了吧?萬(wàn)一我的私鑰被「彩虹攻擊」了怎么辦?……簡(jiǎn)而言之,任何人都害怕自己的資產(chǎn)被盜,雖然這是小概率事件,但它一定會(huì)發(fā)生,要不然也不會(huì)有「墨菲定律」存在。
使用 Open Blockchain 系統(tǒng),我們需要具備保護(hù)自己資產(chǎn)的能力,因?yàn)檫@個(gè)系統(tǒng)不具備掛失、凍結(jié)、回滾等功能。這篇文章的目的,就是在 BM 的團(tuán)隊(duì)做出基于 iPhone 的硬件錢(qián)包之前,教你如何在去中心化的世界里保護(hù)自己的財(cái)產(chǎn)。
相信你已經(jīng)猜到了,提高錢(qián)包安全性的辦法就是多重簽名(Multiple Signatures),背后的邏輯也很簡(jiǎn)單,如果 1 個(gè)秘鑰被破解的概率是 10^{-n}10?n,那么使用 2 個(gè)就變成了 10^{-2n}10?2n,以此類(lèi)推。你可能會(huì)說(shuō),多簽技術(shù)在 Bitcoin 誕生的時(shí)候——10年前就有了,這可不是 EOS 的專利和創(chuàng)新。確實(shí)如此,不過(guò) EOS 在此基礎(chǔ)之上做了一些優(yōu)化,在我看來(lái),這些優(yōu)化足以讓多重簽名技術(shù)更為普及,乃至于在大范圍內(nèi)提升了賬戶的安全性。
EOS 對(duì)錢(qián)包的優(yōu)化主要體現(xiàn)在兩點(diǎn):
引進(jìn)了賬戶的概念,讓原本抽象的事物更為具體,在過(guò)去,誰(shuí)會(huì)把一個(gè)256位的數(shù)字(私鑰)和一個(gè)賬戶對(duì)應(yīng)起來(lái)啊?如果一個(gè)數(shù)字對(duì)應(yīng)一個(gè)賬戶,那誰(shuí)會(huì)意識(shí)到用多個(gè)數(shù)字(私鑰)對(duì)同一個(gè)賬戶去簽名呢?但有了賬戶的概念之后,一切變得非常自然和清晰。當(dāng)你創(chuàng)建一個(gè)賬戶的時(shí)候,它天然的就對(duì)應(yīng)了兩個(gè)秘鑰,也就是說(shuō),這個(gè)體系一開(kāi)始就給你灌輸了:你至少要用兩個(gè)秘鑰來(lái)保護(hù)你的 EOS 及其他 Tokens。
在動(dòng)手之前,我再來(lái)給你普及下 EOS 賬戶的設(shè)計(jì)邏輯,下表是我的 EOS 賬戶的設(shè)定:
上表中,除了權(quán)限(Permission)和秘鑰(Keys)之外,還有兩欄,一個(gè)是權(quán)重(Weight),另一個(gè)是域值(Threshold),這兩個(gè)概念也至關(guān)重要,還是拿大家熟悉的轉(zhuǎn)賬來(lái)舉個(gè)例子吧,按照上表的配置,如果你想轉(zhuǎn)賬給 vitalikoneos 這個(gè)賬戶,你需要將秘鑰的權(quán)重相加,如果結(jié)果不小于域值,該筆交易才被認(rèn)為是合法的,即 EOS7... 和 EOS8... 對(duì)應(yīng)的私鑰都得對(duì)該筆交易簽名,它們的權(quán)重和才不小于域值 2 。同樣的道理,如果你想修改 @Active 的秘鑰,你需要用 EOS6... 和 EOS5... 所對(duì)應(yīng)的秘鑰同時(shí)對(duì)這個(gè)操作進(jìn)行簽名。可以看到我用了 4 對(duì)秘鑰對(duì)來(lái)管理我的賬戶,這個(gè)安全性已經(jīng)非常高了。當(dāng)你創(chuàng)建一個(gè)賬戶時(shí),你的賬戶默認(rèn)包含兩種權(quán)限:@owner 和 @active,其中 @owner主要用來(lái)管理其他權(quán)限的變更,例如修改 @active 對(duì)應(yīng)的 Keys,新建或刪除一個(gè) @publish 權(quán)限等;而 @active 權(quán)限在創(chuàng)建之初主要用來(lái)執(zhí)行轉(zhuǎn)賬等合約操作,即如果你要轉(zhuǎn)出 EOS,你需要 @active 下的 Keys 對(duì)該筆交易簽名。
好了,原理講清楚了,下面我會(huì)手把手教你怎么操作。在 BM 的錢(qián)包沒(méi)有發(fā)布之前,最安全的錢(qián)包當(dāng)然是 github 上的「命令行錢(qián)包」了,這個(gè)錢(qián)包由兩個(gè)組件組成:keosd和 cleos,其中 keosd 用來(lái)保管私鑰,而 cleos 提供交互命令行,并在 keosd 和 nodeos(全節(jié)點(diǎn)) 之間建立通信,它們的關(guān)系如下:
準(zhǔn)備工作
首先,你要安裝 EOSIO 軟件,推薦你使用 docker,下載 EOSIO docker 鏡像,這個(gè)鏡像是官方打包的,可以放心使用
$ docker pull eosio/eos-dev
完成后,運(yùn)行 keosd:
sudo docker run -d --restart=unless-stopped --name keosd \ -v /your/eosio-wallet/path:/opt/eosio/bin/data-dir \ -v /your/eosio-wallet/path:/root/eosio-wallet \ -t eosio/eos /opt/eosio/bin/keosd \ --wallet-dir /opt/eosio/bin/data-dir \ --http-server-address=127.0.0.1:8900
上面的命令中,/your/eosio-wallet/path 需要你自行配置,keosd 管理的錢(qián)包文件會(huì)放在該路徑下。
設(shè)置 cleos 的別名,你可以將 alias 命令加到 ~/.zshrc(macOS)或 ~/.bashrc(Linux) 中,接著執(zhí)行 cleos get info 命令獲取主網(wǎng)信息
$ alias cleos='sudo docker exec -i keosd /opt/eosio/bin/cleos \ --wallet-url http://127.0.0.1:8900 -u http://mainnet.eoscanada.com '$ cleos get info{ "chain_id":"aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906", ...}
確定 chain_id 的值,正確無(wú)誤后,就可以開(kāi)始“試驗(yàn)”了——一定要先在小額賬號(hào)上操作,避免誤操作導(dǎo)致的損失。
創(chuàng)建錢(qián)包、秘鑰、賬戶
要實(shí)現(xiàn)多簽,你至少需要 2 對(duì)秘鑰,秘鑰存在錢(qián)包里,所以這里最好也創(chuàng)建兩個(gè)錢(qián)包,每個(gè)錢(qián)包管理一對(duì)秘鑰,這樣你的錢(qián)包就可以分開(kāi)保管,避免一個(gè)錢(qián)包泄露后兩個(gè)秘鑰都丟失的情況。
$ cleos wallet create -n w1Creating wallet: w1Save password to use in the future to unlock this wallet.Without password imported keys will not be retrievable."PW5KRMedja6trXRT9Pi4z4gLN5YLE95mxQBuBKvy9UCkBaGWMNUEx"$$ cleos wallet create -n w2Creating wallet: w2Save password to use in the future to unlock this wallet.Without password imported keys will not be retrievable."PW5KT6RSfSm5cSBQ4jujBc8N8yXG6KwyphnYe8Rm1uMfFFUS5qkjF"$$ ls /your/eosio-wallet/pathw1.wallet w2.wallet
上面的命令為你創(chuàng)建了 2 個(gè)錢(qián)包 w1 和 w2,在 /your/eosio-wallet/path 路徑下,你可以看到這兩個(gè)錢(qián)包文件,注意: PW 開(kāi)頭的密碼你一定要記錄下來(lái),和錢(qián)包分開(kāi)保管,錢(qián)包解鎖(unlock)的時(shí)候需要這個(gè)密碼。
為每個(gè)錢(qián)包創(chuàng)建和導(dǎo)入秘鑰對(duì)
$ cleos wallet create_key -n w1Created new private key with a public key of: "EOS7bePjtecDvVwRj937B3aaaXyph1vGdAkgu5jibYJ1vfWNaCUWk"$ cleos wallet create_key -n w2Created new private key with a public key of: "EOS4z4VM5QH4NWAGf2BpYKhHxhqM7Dti2Ssmk6XXk1v7U1kjaVPgS"
使用過(guò)老版本 EOSIO 的同學(xué)一定注意到了這個(gè)差異:新版本的 EOS 在創(chuàng)建秘鑰的過(guò)程中把私鑰隱藏了,且直接將私鑰導(dǎo)入到了錢(qián)包,這一步優(yōu)化將你犯錯(cuò)的可能性降至 0——讓你沒(méi)有機(jī)會(huì)復(fù)制私鑰(如果某軟件監(jiān)聽(tīng)了你的剪切板,再把監(jiān)聽(tīng)結(jié)果上傳到他們的服務(wù)器,你的私鑰就泄露了),干得漂亮!
現(xiàn)在秘鑰和錢(qián)包都準(zhǔn)備好了,還差賬號(hào),這里要分兩種情況考慮:
沒(méi)有賬號(hào)的情況下,需要?jiǎng)?chuàng)建新賬號(hào)已有賬號(hào)的情況1. 創(chuàng)建新賬號(hào)
如果你之前沒(méi)有賬號(hào),就需要先創(chuàng)建賬號(hào),同時(shí)用 EOS 來(lái)抵押計(jì)算(CPU)和帶寬(Bandwidth)資源、購(gòu)買(mǎi)存儲(chǔ)資源(RAM),然后再執(zhí)行第 2 步(如果你已有賬號(hào),直接到第 2 步),先創(chuàng)建賬號(hào):
$ cleos system newaccount --stake-net '0.1 EOS' --stake-cpu '0.1 EOS' \> --buy-ram-kbytes 4 friends_account vitalikoneos \ > EOS4z4VM5QH4NWAGf2BpYKhHxhqM7Dti2Ssmk6XXk1v7U1kjaVPgS
上面的參數(shù)里,friends_account 是其他人的賬號(hào),你可以找個(gè)朋友幫你創(chuàng)建,這一步里,抵押了 0.2 個(gè) EOS,同時(shí)還購(gòu)買(mǎi)了 4K 的內(nèi)存,最后兩個(gè)參數(shù)分別是新賬號(hào)名 vitalikoneos 和該賬號(hào)對(duì)應(yīng)的初始公鑰,完成這一步后,你就可以根據(jù)第 2 步來(lái)修改權(quán)限了。
2. 已有賬號(hào)
如果你已有賬號(hào),只需將現(xiàn)有賬號(hào)轉(zhuǎn)移到新創(chuàng)建的秘鑰下即可,假設(shè)你的賬號(hào)為 vitalikoneos ,下面的命令會(huì)設(shè)置該賬號(hào)下的 @owner 秘鑰,
$ cleos set account permission vitalikoneos owner '{ "keys": [{ "key": "EOS7bePjtecDvVwRj937B3aaaXyph1vGdAkgu5jibYJ1vfWNaCUWk", "weight": 1 }, { "key": "EOS4z4VM5QH4NWAGf2BpYKhHxhqM7Dti2Ssmk6XXk1v7U1kjaVPgS", "weight": 1 }], "threshold": 2}' -p vitalikoneos@ownerexecuted transaction: 4e309dc8c3e0535a4d9fec7eb575d... 208 bytes 1201 uswarning: transaction executed locally, but may not be confirmed by the network yet# eosio <= eosio::updateauth {"account":"vitalikoneos","permission":"owner","parent":"","auth":{"threshold":2,"keys":[{"key":"EOS...
@owner 權(quán)限設(shè)置完后,同樣的方法再設(shè)置下 @active 的權(quán)限,差異是修改 @active 權(quán)限時(shí),需要指定 @owner 這個(gè)“擁有者”(倒數(shù)第 2 個(gè)參數(shù)),因?yàn)橹挥兴趴梢孕薷?nbsp;@active :
$ cleos set account permission vitalikoneos active '{ "keys": [{ "key": "EOS7bePjtecDvVwRj937B3aaaXyph1vGdAkgu5jibYJ1vfWNaCUWk", "weight": 1 }, { "key": "EOS4z4VM5QH4NWAGf2BpYKhHxhqM7Dti2Ssmk6XXk1v7U1kjaVPgS", "weight": 1 }], "threshold": 2}' owner -p vitalikoneos@ownerexecuted transaction: 4e309dc8c3e0535a4d9fec7eb575d... 208 bytes 1201 uswarning: transaction executed locally, but may not be confirmed by the network yet# eosio <= eosio::updateauth {"account":"vitalikoneos","permission":"active","parent":"owner","auth":{"threshold":2,"keys":[{"key":"EOS...
執(zhí)行成功后,你可以通過(guò) cleos get account vitalikoneos -j 命令查看修改是否生效,你還可以通過(guò) https://scaneos.io/ 區(qū)塊瀏覽器來(lái)查看指定賬號(hào)的權(quán)限信息。
親自試一試
修改好權(quán)限后,你應(yīng)該會(huì)迫不及待的想試一下了,我們先把 2 個(gè)錢(qián)包都解鎖,然后執(zhí)行 transfer 操作,可以看到轉(zhuǎn)賬成功了:
$ cleos transfer vitalikoneos other_account "0.0001 EOS" 'memo'executed transaction: ba4e886fe9e49c9d3093585273341753e 144 bytes 1064 uswarning: transaction executed locally, but may not be confirmed by the network yet# eosio.token <= eosio.token::transfer {"from":"vitalikoneos","to":"other_account","quantity":"0.0001 EOS","memo":"memo"}# vitalikoneos <= eosio.token::transfer {"from":"vitalikoneos","to":"other_account","quantity":"0.0001 EOS","memo":"memo"}# other_account <= eosio.token::transfer {"from":"vitalikoneos","to":"other_account","quantity":"0.0001 EOS","memo":"memo"}
接下來(lái)我們鎖住任意一個(gè)錢(qián)包,例如 w1,然后再重復(fù)上面的轉(zhuǎn)賬操作
$ cleos wallet lock -n w1$ cleos transfer vitalikoneos other_account '0.0001 EOS' 'memo'Error 3090003: provided keys, permissions, and delays do not satisfy declared authorizationsEnsure that you have the related private keys inside your wallet and your wallet is unlocked.Error Details:transaction declares authority '{"actor":"vitalikoneos","permission":"active"}', but does not have signatures for it.
可以看到出錯(cuò)了,錯(cuò)誤原因是沒(méi)有滿足轉(zhuǎn)賬權(quán)限,實(shí)驗(yàn)成功。至此,EOSIO 上的多重簽名實(shí)操就結(jié)束了,理解了上述操作后,你就可以獨(dú)立保管好自己的 EOS 了,同時(shí)再也不用擔(dān)心錢(qián)包被賊惦記了,是不是既很贊又很簡(jiǎn)單的樣子?
參考:
developers.eos.io5分鐘學(xué)會(huì)注冊(cè)EOS主網(wǎng)賬戶、投票和發(fā)幣
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來(lái)源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來(lái)源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為T(mén)MT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。