簡(jiǎn)介
本篇我們將會(huì)學(xué)習(xí)EOS自帶的命令行錢包的使用方法帐偎,我們將會(huì)使用cleos來(lái)控制keosd服務(wù)對(duì)本地錢包進(jìn)行管理捂人。
雖然現(xiàn)在市面上已經(jīng)有很多支持EOS的錢包了御雕,有Web錢包,有app錢包滥搭,還有瀏覽器插件錢包,著名有scatter錢包捣鲸、TokenPocket錢包還有MeetOne錢包等瑟匆。但是基于服務(wù)器上的錢包管理我們還是必須要學(xué)會(huì)使用keosd的功能,而且栽惶,從安全性來(lái)說(shuō)愁溜,三方的終究沒有官方的更讓人放心吧,我的同事就遇到過(guò)被三方sdk盜號(hào)的情況外厂,所以作為開發(fā)人員冕象,熟練使用keosd的功能,對(duì)我們管理EOS節(jié)點(diǎn)和管理私鑰都至關(guān)重要汁蝶,更何況我們后續(xù)的學(xué)習(xí)都還要基于它呢渐扮。
前置條件
要使用錢包的功能,我們至少要安裝好了EOS掖棉,包括cleos和keosd墓律,如果使用docker安裝的,我們需要借助docker容器內(nèi)環(huán)境來(lái)操作幔亥,所以建議直接通過(guò)docker的exec命令進(jìn)入到容器內(nèi)部耻讽。
keosd與cleos
在前面EOS基礎(chǔ)全家桶(四)啟動(dòng)節(jié)點(diǎn)中我們介紹了,cleos是一個(gè)命令行工具帕棉,可以通過(guò)rpc接口管理nodeos和keosd针肥,而keosd則是一個(gè)錢包和私鑰文件的管理服務(wù)饼记,本身提供了sockets、http及https的接口慰枕,支持訪問(wèn)控制和webauth的配置握恳。本文只會(huì)介紹基本的功能。
特別說(shuō)明:
下面的文章中使用的截圖中cleos命令大部分都會(huì)帶上—wallet-url參數(shù)捺僻,改參數(shù)并非必須乡洼,只是為了使用特定錢包目錄和服務(wù)而加上。
啟動(dòng)/停止錢包服務(wù)
默認(rèn)啟停錢包服務(wù)
啟動(dòng)
默認(rèn)當(dāng)我們使用cleos的wallet命令操作時(shí)會(huì)自動(dòng)判斷是否已啟動(dòng)了keosd服務(wù)匕坯,如果沒有啟動(dòng)就會(huì)使用默認(rèn)配置啟動(dòng)keosd束昵。
比如我們使用命令cleos wallet list時(shí),可以看到命令行中出現(xiàn)了一行keosd launched的提示葛峻,就表示默認(rèn)錢包服務(wù)已經(jīng)啟動(dòng)了锹雏。
停止
最簡(jiǎn)單的方式就是使用命令cleos wallet stop,當(dāng)然你也可以直接殺掉keosd的進(jìn)程术奖。
手動(dòng)啟停錢包服務(wù)
啟動(dòng)
我們可以手動(dòng)啟動(dòng)keosd礁遵,可以指定它的啟動(dòng)端口、文件目錄和解鎖時(shí)間等采记。錢包的默認(rèn)路徑為用戶目錄下的eosio-wallet文件夾(~/eosio-wallet/)佣耐。下面的命令我們制定了socket的入口文件狡孔,解鎖時(shí)間和錢包目錄截碴。
keosd --unlock-timeout 100 \
--unix-socket-path ~/study/eosio-wallet/keosd.sock \
--wallet-dir ~/study/eosio-wallet
執(zhí)行后如果看到如圖所示耀石,就表示啟動(dòng)成功了谐岁。
啟動(dòng)后錢包目錄下會(huì)產(chǎn)生socket通信文件和錢包文件wallet.lock亥鬓。
這種啟動(dòng)方式的優(yōu)點(diǎn)是可以更方便的設(shè)定錢包啟動(dòng)參數(shù)湾笛,包括端口碳胳、目錄這些可能需要特例化的設(shè)置參數(shù)烦租。
缺點(diǎn)是不夠簡(jiǎn)單方便丸冕,程序是前臺(tái)程序耽梅,啟動(dòng)后不能退出,需要使用nohup或者pm2等程序托管啟動(dòng)胖烛。
另外我們可以使用config.ini文件來(lái)配置啟動(dòng)參數(shù)眼姐,只需創(chuàng)建config.ini文件,并放置在wallet目錄下洪己。文件內(nèi)容可參考默認(rèn)配置妥凳,如下:
# The filename (relative to data-dir) to create a unix socket for HTTP RPC; set blank to disable. (eosio::http_plugin)
# unix-socket-path = kaccd.sock
# The local IP and port to listen for incoming http connections; leave blank to disable. (eosio::http_plugin)
# http-server-address =
# The local IP and port to listen for incoming https connections; leave blank to disable. (eosio::http_plugin)
# https-server-address =
# Filename with the certificate chain to present on https connections. PEM format. Required for https. (eosio::http_plugin)
# https-certificate-chain-file =
# Filename with https private key in PEM format. Required for https (eosio::http_plugin)
# https-private-key-file =
# Configure https ECDH curve to use: secp384r1 or prime256v1 (eosio::http_plugin)
# https-ecdh-curve = secp384r1
# Specify the Access-Control-Allow-Origin to be returned on each request. (eosio::http_plugin)
# access-control-allow-origin =
# Specify the Access-Control-Allow-Headers to be returned on each request. (eosio::http_plugin)
# access-control-allow-headers =
# Specify the Access-Control-Max-Age to be returned on each request. (eosio::http_plugin)
# access-control-max-age =
# Specify if Access-Control-Allow-Credentials: true should be returned on each request. (eosio::http_plugin)
# access-control-allow-credentials = false
# The maximum body size in bytes allowed for incoming RPC requests (eosio::http_plugin)
# max-body-size = 1048576
# Maximum size in megabytes http_plugin should use for processing http requests. 503 error response when exceeded. (eosio::http_plugin)
# http-max-bytes-in-flight-mb = 500
# Append the error log to HTTP responses (eosio::http_plugin)
# verbose-http-errors = false
# If set to false, then any incoming "Host" header is considered valid (eosio::http_plugin)
# http-validate-host = true
# Additionaly acceptable values for the "Host" header of incoming HTTP requests, can be specified multiple times.? Includes http/s_server_address by default. (eosio::http_plugin)
# http-alias =
# Number of worker threads in http thread pool (eosio::http_plugin)
# http-threads = 2
# The path of the wallet files (absolute path or relative to application data dir) (eosio::wallet_plugin)
# wallet-dir = "."
# Timeout for unlocked wallet in seconds (default 900 (15 minutes)). Wallets will automatically lock after specified number of seconds of inactivity. Activity is defined as any wallet command e.g. list-wallets. (eosio::wallet_plugin)
# unlock-timeout = 900
# Override default URL of http://localhost:12345 for connecting to yubihsm-connector (eosio::wallet_plugin)
# yubihsm-url =
# Enables YubiHSM support using given Authkey (eosio::wallet_plugin)
# yubihsm-authkey =
# Plugin(s) to enable, may be specified multiple times
# plugin =
停止
停止錢包服務(wù)比較簡(jiǎn)單,有多種方式:
? ? 如果你使用的是直接前臺(tái)啟動(dòng)的話答捕,你只要ctrl+c終止進(jìn)程就行了逝钥,或者直接關(guān)閉啟動(dòng)了keosd的命令行。
? ? 如果你是后臺(tái)啟動(dòng)的,你直接殺掉keosd進(jìn)程就行了,或者在開發(fā)環(huán)境可以直接killall keosd艘款。
? ?你也可以使用cleos來(lái)關(guān)閉持际,如果你使用的是默認(rèn)錢包文件路徑,可以直接使用cleos wallet stop哗咆,否則你需要指定錢包socket文件參數(shù)—wallet-url蜘欲,如下:
cleos --wallet-url unix:///Users/astaldo/study/eosio-wallet/keosd.sock \
wallet stop
創(chuàng)建錢包
我們已經(jīng)啟動(dòng)錢包服務(wù)了,要?jiǎng)?chuàng)建一個(gè)新錢包晌柬,我們只需要使用cleos wallet create命令即可姥份,create命令有幾個(gè)參數(shù)。
-n 指定錢包名字
-f 指定輸出錢包密碼的文件年碘,未指定—to-console時(shí)為必須參數(shù)
—to-console 指定錢包密碼輸出到控制臺(tái)中澈歉,優(yōu)先級(jí)高于-f
我們創(chuàng)建一個(gè)名字為dev的錢包吧。
cleos wallet create -n dev --to-console
紅框部分就是錢包的密碼啦屿衅,每個(gè)錢包的密碼都是隨機(jī)生成的埃难。如果使用-f參數(shù)指定了一個(gè)文件,密碼就會(huì)保存到文件中涤久,而不會(huì)顯示在控制臺(tái)涡尘。
新創(chuàng)建的錢包默認(rèn)是解鎖狀態(tài),解鎖時(shí)間由keosd的配置決定响迂,默認(rèn)是15分鐘考抄,如需修改解鎖時(shí)間請(qǐng)參考手動(dòng)啟停錢包服務(wù)。
生成私鑰對(duì)
創(chuàng)建私鑰對(duì)是非常實(shí)用的功能栓拜,你新建賬號(hào)座泳,新建權(quán)限都需要配置公鑰,網(wǎng)絡(luò)上有很多生成私鑰對(duì)的開放工具幕与,但是對(duì)于開發(fā)者而言,本地生成無(wú)疑是最佳選擇镇防,相對(duì)安全性要高很多啦鸣。
直接生成
使用cleos的cleos create key命令就可以方便的生成,命令有幾個(gè)參數(shù)来氧。
—r1 指定使用R1曲線算法诫给,默認(rèn)使用的是K1曲線算法
-f 指定輸出的文件,未指定—to-console時(shí)為必須參數(shù)
—to-console 指定輸出到控制臺(tái)中啦扬,優(yōu)先級(jí)高于-f
—r1參數(shù)只在特定的場(chǎng)景下需要使用中狂,默認(rèn)不需要指定。
我們生成一個(gè)新的私鑰對(duì)到控制臺(tái)扑毡。
cleos create key --to-console
Private key就是私鑰胃榕,Public key就是公鑰了。如果使用-f參數(shù)指定了一個(gè)文件瞄摊,密碼就會(huì)保存到文件中勋又,而不會(huì)顯示在控制臺(tái)苦掘。
生成到錢包
我們還可以直接生成到錢包里,使用cleos wallet create_key命令即可楔壤,命令有幾個(gè)參數(shù)鹤啡。
-n 指定錢包名字
key_type 指定使用R1還是K1曲線算法,默認(rèn)K1
我們生成一個(gè)新的私鑰對(duì)到錢包dev中蹲嚣。
cleos wallet create_key -n dev
注意:錢包必須處于解鎖狀態(tài)递瑰。?解鎖錢包可以看解鎖。
可以看到隙畜,該方法最大的好處就是直接可以把私鑰導(dǎo)入錢包中抖部,且不會(huì)直接暴露私鑰。如果要查看該公鑰對(duì)應(yīng)的私鑰禾蚕,我們?cè)?a target="_blank">查看當(dāng)前已導(dǎo)入key會(huì)講解您朽。
導(dǎo)入私鑰
錢包的功能就是用來(lái)安全管理公私鑰,且在后續(xù)我們需要簽名的操作時(shí)提供私鑰簽名换淆。所以導(dǎo)入私鑰是非常常用的功能哗总。
使用cleos wallet import命令可以將私鑰導(dǎo)入錢包,命令有幾個(gè)參數(shù)倍试。
-n 指定錢包名字
—private-key WIF格式的私鑰
我們通常情況肯定是不推薦使用—private-key參數(shù)的讯屈,這會(huì)把私鑰明文顯示在命令中。
Private key: 5J4TCnyXzbPLXuXTC4gnPWno1gye2RE1LXzTgXRSPRizHASq89e
Public key: EOS7K78LBkRQD4WA2LUbG6P2KhtKMqhCrbMsxEEYd7dbACqXZytTk
我們嘗試導(dǎo)入上面這組私鑰到dev錢包中县习。
cleos wallet import -n dev
輸入命令后就會(huì)提示輸入private key涮母,此時(shí)是安全輸入,不會(huì)顯示在屏幕上躁愿,你只需粘貼或者輸入私鑰后按回車即可叛本。
導(dǎo)入成功后我們可以核對(duì)一個(gè)公鑰是否一致。
鎖定與解鎖
錢包解鎖后在超過(guò)鎖定時(shí)間時(shí)彤钟,會(huì)自動(dòng)鎖定錢包来候,這是為了增加安全性,在開發(fā)環(huán)境我們可以調(diào)大鎖定時(shí)間逸雹,請(qǐng)參考手動(dòng)啟停錢包服務(wù)营搅。
解鎖
使用命令cleos wallet unlock即可解鎖,命令有幾個(gè)參數(shù)梆砸。
-n 指定錢包名字
—password 錢包密碼
同樣的转质,我們并不建議使用—password參數(shù),這會(huì)把錢包密碼暴露在命令中帖世。
我們來(lái)解鎖dev錢包試試休蟹。
cleos wallet unlock -n dev
輸入命令后就會(huì)提示輸入password,此時(shí)是安全輸入,不會(huì)顯示在屏幕上鸡挠,你只需粘貼或者輸入密碼后按回車即可辉饱。
看到Unlocked就表示已經(jīng)解鎖了。如果錢包已經(jīng)解鎖拣展,再嘗試解鎖時(shí)會(huì)報(bào)錯(cuò)彭沼。
鎖定
在使用完錢包功能后,或者需要切換別的錢包時(shí)备埃,處于安全考慮姓惑,我們可能需要手動(dòng)鎖定指定錢包,不然你只有等自動(dòng)鎖定了按脚。
鎖定錢包有兩個(gè)命令可用于毙,cleos wallet lock_all和cleos wallet lock,前者是直接鎖定所有已解鎖的錢包辅搬,后者則需要指定需要鎖定的錢包名唯沮。
這里只說(shuō)明一下鎖定特定錢包的命令,命令只有一個(gè)參數(shù)-n指定錢包名堪遂。我們鎖定dev錢包介蛉。
cleos wallet lock -n dev
移除私鑰
某個(gè)私鑰不需要保存在錢包中了,我們就需要?jiǎng)h除這個(gè)私鑰溶褪,操作也很簡(jiǎn)單币旧,首先還是要確保錢包已解鎖,然后使用命令cleos wallet remove_key即可猿妈,命令有幾個(gè)參數(shù)吹菱。
-n 指定錢包名字
—password 錢包密碼
key 公鑰(必填)
即使你的錢包已經(jīng)解鎖了,在執(zhí)行時(shí)仍要帶上錢包密碼或者輸入錢包密碼彭则,這是為了二次確認(rèn)鳍刷,畢竟私鑰一旦刪除就沒了。
我們刪除dev錢包中的EOS7mAKAfpgX4uBsSV9rmDYJCK9GjYGSpRLZ7tz5E9W1nR5Uw7pHH這個(gè)公鑰俯抖。
cleos wallet remove_key -n dev \
EOS7mAKAfpgX4uBsSV9rmDYJCK9GjYGSpRLZ7tz5E9W1nR5Uw7pHH
查看
我們需要關(guān)注錢包的解鎖狀態(tài)倾剿,錢包內(nèi)已經(jīng)導(dǎo)入了哪些私鑰對(duì),導(dǎo)入的私有又是什么……所以錢包肯定要提供查看的功能蚌成。
查看當(dāng)前已導(dǎo)入key
我們?nèi)绻枰榭串?dāng)前解鎖的錢包中都有哪些可用的key,只需輸入cleos wallet keys凛捏。
注意:這會(huì)列出所有已解鎖錢包里的key担忧。
查看錢包狀態(tài)
如果你有多個(gè)錢包,而你又需要同時(shí)解鎖多個(gè)錢包坯癣,你可能會(huì)需要查看當(dāng)前個(gè)錢包的解鎖狀態(tài)瓶盛。只要使用命令cleos wallet list即可。
可以看到,這里會(huì)列出所有的錢包惩猫,其中錢包名后面有個(gè)星號(hào)(*)表示這個(gè)錢包當(dāng)前處于解鎖狀態(tài)芝硬。
查看錢包中的私鑰
我們要將私鑰導(dǎo)出或者導(dǎo)入到其他的錢包應(yīng)用里,那么我們就需要查看這個(gè)公鑰的私鑰是什么了轧房。我們?nèi)匀恍枰_保錢包已經(jīng)解鎖拌阴,然后使用命令cleos wallet private_keys即可,命令有幾個(gè)參數(shù)奶镶。
-n 指定錢包名字
—password 錢包密碼
即使你的錢包已經(jīng)解鎖了迟赃,你在執(zhí)行命令時(shí)還是需要帶上錢包密碼或者輸入錢包密碼,同樣是為了安全考慮的二次驗(yàn)證厂镇。
我們查看dev錢包的所有私鑰對(duì)纤壁。
cleos wallet private_keys -n dev
刪除錢包
如果你需要直接刪除整個(gè)錢包里的內(nèi)容,最快的方式就是直接找到錢包文件目錄捺信,然后刪除與錢包名同名的文件酌媒。比如你要?jiǎng)h除dev的錢包文件,你就直接刪除dev.wallet文件就可以了迄靠。
更多內(nèi)容請(qǐng)關(guān)注微信公眾號(hào)