準(zhǔn)備工作
跟以太坊不同署拟,EOS引入了Account賬戶,Wallet錢包歌豺,錢包密碼芯丧,權(quán)限,等眾多概念世曾,理清楚這些概念缨恒,對(duì)盡快上手EOS開發(fā)有很大幫助,在正式上手前轮听,先讓我們梳理一下這些概念吧~~
如右圖所示骗露,Wallet是用來(lái)存儲(chǔ)私鑰的,錢包對(duì)應(yīng)一個(gè)密碼血巍,輸入密碼才能解鎖錢包萧锉,讀取私鑰。左邊為一個(gè)EOS賬戶述寡,里面存儲(chǔ)著智能合約公鑰等柿隙,你可以把它看做一個(gè)保險(xiǎn)箱,需要拿去錢包里的私鑰才能解鎖這個(gè)保險(xiǎn)箱鲫凶。
在EOS賬戶體系中禀崖,默認(rèn)有兩種權(quán)限,即Owner和Active
owner權(quán)限是賬戶最高權(quán)限螟炫,具有Active所有權(quán)限波附,以及重置Active
Active是操作權(quán)角色,可用于平時(shí)的轉(zhuǎn)賬昼钻、投票等日常操作
除此之外掸屡,賬戶還可以自定義權(quán)限,來(lái)擴(kuò)展對(duì)賬戶權(quán)限的管理然评,十分靈活也帶來(lái)很多可能性仅财。
錢包(Wallet)
? ? 存儲(chǔ)秘鑰
? ? Lock和Unlock狀態(tài)
? ? 簽名授權(quán)
賬戶(Account)
? ? 可讀名字(12個(gè)字符),被個(gè)人或多人擁有
? ? 多權(quán)限管理碗淌、支持多簽名盏求、支持自定義權(quán)限
? ? 可定義Action和Handler
EOS Dawn 3.0測(cè)試版本中創(chuàng)建一個(gè)賬戶的命令是:
? ? cleos create account{創(chuàng)建者賬戶名}{新的賬戶名}公鑰1 公鑰2
其中{創(chuàng)建者賬戶名}是為這個(gè)創(chuàng)建動(dòng)作支付EOS的賬戶抖锥,公鑰1和公鑰2分別是兩個(gè)不同權(quán)限的密鑰對(duì)的公鑰。
有了前面環(huán)境的搭建风喇,現(xiàn)在可以開始啟動(dòng)測(cè)試鏈宁改,進(jìn)行開始測(cè)試錢包啦~~
沒(méi)有搭建環(huán)境的小伙伴缕探,請(qǐng)先參考EOS快速入門(一)搭建ubuntu開發(fā)環(huán)境
啟動(dòng)測(cè)試鏈
sudo docker run --rm --name eosio -d -p 8888:8888 -p 9876:9876 -v /tmp/work:/work -v /tmp/eosio/data:/mnt/dev/data -v /tmp/eosio/config:/mnt/dev/config eosio/eos-dev? /bin/bash -c "nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::wallet_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --plugin eosio::http_plugin -d /mnt/dev/data --config-dir /mnt/dev/config --http-server-address=0.0.0.0:8888 --access-control-allow-origin=* --contracts-console"
在這里解釋一下上面的啟動(dòng)命令做了哪些設(shè)置
使用eosio/eos鏡像魂莫,啟動(dòng)一個(gè)名稱是eosio的容器。
啟動(dòng)后將容器的8888端口映射到本機(jī)8888端口爹耗,9876端口映射到本機(jī)9876端口耙考。
將docker容器里的3個(gè)文件夾連接到本地硬盤。
在Bash里啟動(dòng)Nodeos潭兽,并加載默認(rèn)的插件倦始,配置服務(wù)器地址,啟用跨域訪問(wèn)以及加入合約調(diào)試功能
將一些目錄掛載到本能/tmp文件夾下山卦,這樣在docker里可以持久化這些目錄
啟動(dòng)keosd
docker run-d--name keosd--network=eosdev \-i eosio/eos-dev/bin/bash-c"keosd --http-server-address=0.0.0.0:9876"
安裝合約開發(fā)工具
到home目錄鞋邑,大約需要二十分鐘
$ wget https://github.com/eosio/eosio.cdt/releases/download/v1.4.0/eosio.cdt-1.4.0.x86_64.deb
有的文章用這個(gè)方法安裝,官網(wǎng)不推薦這種方法账蓉,親測(cè)很坑枚碗,簡(jiǎn)易用上面的方式安裝。
git clone --recursive https://github.com/eosio/eosio.cdt --branch v1.3.2 --single-branch
cd eosio.cdt
./build.sh
安裝
$ sudo apt install ./eosio.cdt-1.4.0.x86_64.deb
? ? 安裝完成后檢測(cè)一下?
? ? $ which eosio-cpp
? ? 執(zhí)行之后 /usr/bin/eosio-cpp
第一步.創(chuàng)建測(cè)試錢包
第一步:創(chuàng)建錢包 以下命令會(huì)默認(rèn)創(chuàng)建一個(gè)名為default的錢包 這里使用
cleos wallet create -n wallet_name --to-console(指定了錢包名字)
$ cleos wallet create --to-console
Creating wallet: wallet_name
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
錢包密碼:PW5KXKRhjR2PuNSkVDoSJRZxQFCi5beJvVTKxPNnTuCFWyNpQdxdp
最后返回一個(gè)錢包铸本,需要保存起來(lái)肮雨。后面的操作會(huì)用到
第二步:打開錢包
$ cleos wallet open -n wallet_name
Opened: wallet_name
可以用下面的命令查看錢包
$ cleos wallet list
Wallets:
[
? "default"
? "wallet_name"
]
第三步:解鎖錢包 解鎖錢包需要輸入上面提到的錢包密碼。
$ cleos wallet unlock -n wallet_name
password: Unlocked: wallet_name
? ? 解鎖后:
$ cleos wallet list wallet_name
Wallets:
[
? "default"
? "wallet_name*"
]
這里wallet_name錢包后面有一個(gè)星號(hào)標(biāo)記來(lái)表示錢包已經(jīng)解鎖了箱玷。
第四步:導(dǎo)入密鑰
錢包是用來(lái)管理密鑰的怨规。密鑰是后面和鏈上的賬戶或者合約交互時(shí)的身份憑證。在這一步使用cleos來(lái)創(chuàng)建一個(gè)密鑰對(duì)锡足。
$ cleos wallet create_key -n wallet_name
Created new private key with a public key of: "EOS6p7ipqZzwgmT8AuhgEzFCBMnqfL57RZLSwsKasiT28r2ro65Pi"
錢包把公鑰地址返回給用戶并自動(dòng)記錄了私鑰波丰。如果用戶想看到這一對(duì)密鑰,可以用下面的命令查看:
$ cleos wallet private_keys -n wallet_name
輸入錢包密碼后舶得,我們就能看到剛才創(chuàng)建的這一對(duì)密鑰
password: [[
? "EOS6p7ipqZzwgmT8AuhgEzFCBMnqfL57RZLSwsKasiT28r2ro65Pi",
? "5J11woL2FDBTacK4NYgmHkycNZc7agN1CJbAb2sJ8e1eY49ojLY"
? ]
]
第五步: 導(dǎo)入eosio賬戶的密鑰
eosio是一個(gè)特殊的賬戶呀舔。它作為默認(rèn)系統(tǒng)用戶來(lái)管理系統(tǒng)的合約和鏈的行為。這個(gè)賬戶的密鑰是固定好了的扩灯。我們需要
導(dǎo)入這個(gè)賬戶的私鑰以便在后面使用這個(gè)賬戶媚赖。
eosio賬戶類似root賬戶
? cd ~/.local/share/eosio/nodeos/config #此文件中會(huì)看到賬戶信息
執(zhí)行下面的命令,并在輸入私鑰提示符出現(xiàn)的時(shí)候輸入 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
$ cleos wallet import -n wallet_name
private key: imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
現(xiàn)在已經(jīng)創(chuàng)建了eosio這個(gè)賬戶的密鑰對(duì)
第六步:創(chuàng)建測(cè)試賬戶
我們將在這一個(gè)部分用eosio賬戶和上一步生成的公鑰創(chuàng)建測(cè)試賬戶alice珠插。
cleos create account eosio alice EOS6p7ipqZzwgmT8AuhgEzFCBMnqfL57RZLSwsKasiT28r2ro65Pi
第七部:操作智能合約
部署一個(gè)智能合約惧磺,需要部署到一個(gè)特定的賬戶。我們先創(chuàng)建一個(gè)hello的賬戶捻撑。
cleos create account eosio hello EOS6p7ipqZzwgmT8AuhgEzFCBMnqfL57RZLSwsKasiT28r2ro65Pi
顯示如下:
executed transaction: 9d8ec5597918187cb58a985159bc79a9b74e7514f3b4c4f7da42cbb5e8c72816? 200 bytes? 334 us
#eosio <= eosio::newaccount? ? ? ? ? ? {"creator":"eosio","name":"hello","owner":{"threshold":1,"keys":[{"key":"EOS6p7ipqZzwgmT8AuhgEzFCBMn...
warning: transaction executed locally, but may not be confirmed by the network yet? ? ? ? ]
在docker 容器里已經(jīng)有一些合約和編譯完成的文件可以直接部署磨隘。 這里選擇一個(gè)簡(jiǎn)單的合約hello來(lái)部署缤底。合約里只有一個(gè)hi方法。 合約的源代碼如下:
#include <eosiolib/eosio.hpp>
using namespace eosio;
class hello : public eosio::contract {
? public:
? using contract::contract;
? /// @abi action
? void hi( account_name user ) {
? ? require_auth( user );
print( "Hello, ", name{user} );
? }
};
EOSIO_ABI( hello, (hi) )
部署的命令如下番捂。其中我們使用了hello這個(gè)賬戶來(lái)部署合約个唧。
$ cleos set contract hello /opt/eosio/contracts/hello
執(zhí)行完顯示如下信息
Reading WASM from /opt/eosio/contracts/hello/hello.wasm...
Publishing contract...
executed transaction: 84df00f6cbabcc2f79361586d30407f0e2d518f3b3f2604641310bd510a652fb? 4168 bytes? 492 us
#? ? ? ? eosio <= eosio::setcode? ? ? ? ? ? ? {"account":"hello","vmtype":0,"vmversion":0,"code":"0061736d01000000013b0c60027f7e006000017e60027e7e...
#? ? ? ? eosio <= eosio::setabi? ? ? ? ? ? ? ? {"account":"hello","abi":"0e656f73696f3a3a6162692f312e30000102686900010475736572046e616d650100000000...
warning: transaction executed locally, but may not be confirmed by the network yet? ? ]
在前面啟動(dòng)docker容器的時(shí)候,我們通過(guò)參數(shù)-v /tmp/eosio/work:/work把容器和外部主機(jī)的目錄連接了起來(lái)设预。 因此放在/tmp/eosio/work的文件可以在容器里通過(guò)/work來(lái)訪問(wèn)到徙歼。
為了調(diào)試改版的智能合約,需要在/tmp/eosio/work下建立一個(gè)contract目錄鳖枕,并開放所有權(quán)限魄梯。
cd /tmp/eosio/work
sudo mkdir contract
現(xiàn)在在contract目錄下建立一個(gè)hello目錄。在hello目錄下創(chuàng)建文件hello.cpp宾符。執(zhí)行如下操作
$ eosiocpp -o hello.wasm hello.cpp
$ eosiocpp -g hello.abi hello.cpp
生成hello.wasm和hello.abi文件酿秸。再部署合約一次
cleos set contract hello /work/contract/hello
執(zhí)行如下命令
$ cleos push action hello hi'["alice"]'-p alice@active
顯示如下,證明執(zhí)行成功
executed transaction: ea8f63479b26fd317fe47501ce8239f7532f6967bd04970d2838120a936174bf? 104 bytes? 256 us#? ? ? ? hello <= hello::hi? ? ? ? ? ? ? ? ? ? {"user":"alice"}
>> Hello,alicewarning: transaction executed locally,but may not be confirmed by the network yet]
到這里魏烫,我們已經(jīng)初步了解了錢包辣苏,賬戶和智能合約的一些基本操作。