EOS DAWN 3.0 已經(jīng)正式發(fā)布了儒搭,這次終于可以在mac上跑起來了悲柱,之前的版本捧请,各種折騰都沒有真正跑起來凡涩,最多只是出了塊,但是智能合約沒有成功執(zhí)行疹蛉。下面主要介紹Mac下啟動(dòng)EOS DAWN3.0 以及運(yùn)行Currency 智能合約活箕。
下載源碼
命令行執(zhí)行
git clone https://github.com/EOSIO/eos --recursive
構(gòu)建EOS
下載完源碼后,我們可以使用EOS提供的自動(dòng)構(gòu)建腳本來構(gòu)建EOS可款。
cd eos
./eosio_build.sh
在使用自動(dòng)構(gòu)建的時(shí)候育韩,不一定就會(huì)構(gòu)建成功,我就是碰到了這個(gè)問題闺鲸。EOS 需要先安裝一些依賴筋讨,自動(dòng)腳本理論上可以自動(dòng)幫你安裝這些依賴,但是由于環(huán)境的不同摸恍,導(dǎo)致有些依賴并不能安裝成功悉罕,那就需要自動(dòng)手動(dòng)去把依賴安裝好了。這里說下我遇到的問題
- MongoDB 自動(dòng)腳本安裝失敗立镶, 這個(gè)是我手動(dòng)執(zhí)行
brew install mongodb
安裝成功壁袄。 - doxygen 自動(dòng)腳本安裝失敗。 這個(gè)問題是brew 下載doxygen的安裝程序失敗了媚媒,但是在瀏覽器上卻是可以下載下來的嗜逻。解決辦法是, 先看下
/usr/local/Library/Formula
目錄中是否存在doxygen.rb
文件,一般在brew install doxygen
的時(shí)候會(huì)下載下來缭召。如果doxygen.rb
文件存在变泄,根據(jù)brew install doxygen
安裝時(shí)顯示的日志可以找到文件的下載路徑https://ftp.stack.nl/pub/users/dimitri/doxygen-1.8.14.src.tar.gz
把這個(gè)文件下載下來令哟,放到~/Library/Caches/Homebrew
目錄中。在執(zhí)行brew install doxygen
妨蛹。 這樣doxygen應(yīng)該就可以安裝成功了屏富,后面再執(zhí)行./eosio_build.sh
就能成功構(gòu)建EOS了。
當(dāng)然也可以不使用自動(dòng)構(gòu)建腳本來構(gòu)建EOS蛙卤,參照官方文檔手動(dòng)吧所有依賴都安裝了狠半。這里就不多做介紹了。
啟動(dòng)單節(jié)點(diǎn)測試網(wǎng)絡(luò)
成功安裝EOS后颤难,我們可以在本地啟動(dòng)一個(gè)單節(jié)點(diǎn)的測試網(wǎng)絡(luò)神年。
可以直接通過一個(gè)命令啟動(dòng)一個(gè)單節(jié)點(diǎn)網(wǎng)絡(luò)
nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::account_history_api_plugin
這樣的壞處就是,以后每次啟動(dòng)都需要手動(dòng)輸入這么長的字符串行嗤,操作會(huì)比較麻煩已日。
EOS為我們提供了配置文件可以省去后面的配置選項(xiàng)。默認(rèn)EOS的配置放置在~/Library/Application Support/eosio/nodeos/config
目錄中栅屏∑В可以通過--config-dir
這個(gè)參數(shù)指定另外的目錄當(dāng)做放置配置文件的目錄。注意栈雳,這個(gè)目錄一開始是不存在的护奈,可以在build/programs/nodeos
目錄中執(zhí)行下 ./nodeos
,然后立即用Ctrl + C
關(guān)閉哥纫。EOS會(huì)自動(dòng)生成這個(gè)目錄霉旗,同時(shí)生成config.ini 和genesis.json 兩個(gè)文件。
接下來我們需要修改下config.ini文件蛀骇,直接把下面這段配置復(fù)制到config.ini 文件后面即可厌秒。
# Enable production on a stale chain, since a single-node test chain is pretty much always stale
enable-stale-production = true
# Enable block production with the testnet producers
producer-name = eosio
# Load the block producer plugin, so you can produce blocks
plugin = eosio::producer_plugin
# Wallet plugin
plugin = eosio::wallet_api_plugin
# As well as API and HTTP plugins
plugin = eosio::chain_api_plugin
plugin = eosio::http_plugin
# This will be used by the validation step below, to view account history
plugin = eosio::account_history_api_plugin
官方文檔顯示genesis-json 也需要修改,其實(shí)是不需要修改的擅憔,直接使用默認(rèn)的就行鸵闪。
最后就是在 eos/build/program/nodeos/目錄執(zhí)行./nodeos
就可以成功啟動(dòng)EOS了。成功啟動(dòng)后可以看到已經(jīng)在出塊了雕欺。
運(yùn)行Currency智能合約
EOS默認(rèn)已經(jīng)提供了一些智能合約的樣例岛马。我們直接拿來使用就可以了棉姐。
創(chuàng)建一個(gè)錢包
每個(gè)一個(gè)智能合約都需要一個(gè)關(guān)聯(lián)的賬戶屠列,賬戶需要使用錢包來創(chuàng)建,所以我們在啟動(dòng)EOS的時(shí)候需要加載錢包插件來創(chuàng)建賬戶伞矩,在之前的配置文件中笛洛,我們已經(jīng)加載了錢包插件,所以這里我們就不需要做什么額外的操作了乃坤。
使用cleos
的 wallet create
命令來創(chuàng)建一個(gè)錢包:
cd ~/eos/build/programs/cleos/
./cleos wallet create
這就會(huì)創(chuàng)建一個(gè)默認(rèn)的錢包苛让,同時(shí)會(huì)輸出一個(gè)密碼沟蔑,自己保存好,以備后面使用狱杰。
加載 Bios 智能合約
設(shè)置eosio.bios
合約為系統(tǒng)默認(rèn)合約瘦材。這個(gè)合約可以讓我們直接控制其他賬戶的資源分配和一些私有api調(diào)用。
$ ./cleos set contract eosio ../../contracts/eosio.bios -p eosio
創(chuàng)建 currency 合約賬戶
為currency 合約生成一個(gè)currency賬戶仿畸,需要兩個(gè) 公鑰食棕、私鑰對,一個(gè)作為public-OwnerKey
一個(gè)作為public-ActiveKey
错沽。
cd ~/eos/build/programs/cleos/
./cleos create key # OwnerKey
./cleos create key # ActiveKey
這將會(huì)輸出兩個(gè) 公私鑰對簿晓,像下面這樣:
Private key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Public key: EOSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
保存好這兩個(gè)公私鑰對,后面會(huì)使用到千埃。
把生成好的兩個(gè)私鑰導(dǎo)入錢包:
./cleos wallet import <private-OwnerKey>
./cleos wallet import <private-ActiveKey>
使用cleos create account
命令來生成 currency 賬戶憔儿。 使用eosio 來認(rèn)證 currency賬戶。 eosio是我們在genesis.json文件中指定的producer 賬戶放可。上面生成的公鑰給currency賬戶當(dāng)作OwnerKey和ActiveKey谒臼。
./cleos create account eosio currency <public-OwnerKey> <public-ActiveKey>
執(zhí)行后會(huì)有結(jié)果返回,像這樣:
executed transaction: fe5c9db1b5173dd4bd1ed79c23056104427ab62b0086cf117175abb322532d93 346 bytes 101544 cycles
# eosio <= eosio::newaccount {"creator":"eosio","name":"currency","owner":{"threshold":1,"keys":[{"key":"EOS6eRfSRYNcrsLmLMomWbBk..." +
驗(yàn)證賬戶是否創(chuàng)建成功:
./cleos get account currency
一切正常的話吴侦,會(huì)輸出類似下面的內(nèi)容:
{
"account_name": "currency",
"permissions": [{
"perm_name": "active",
"parent": "owner",
"required_auth": {
"threshold": 1,
"keys": [{
"key": "EOS8kjeKVzFfqYyqcG8EnRLvMyLjJ7nmSM8p7QqDazGnjMEtQd1dp",
"weight": 1
}
],
"accounts": []
}
},{
"perm_name": "owner",
"parent": "",
"required_auth": {
"threshold": 1,
"keys": [{
"key": "EOS6eRfSRYNcrsLmLMomWbBk317gz2TcBqArL7JwaqvaYkWYALe73",
"weight": 1
}
],
"accounts": []
}
}
]
}
上傳 currency 合約到 區(qū)塊鏈上
在上傳之前屋休,我們可以驗(yàn)證下區(qū)塊鏈上是否已經(jīng)有currency合約:
./cleos get code currency
code hash: 0000000000000000000000000000000000000000000000000000000000000000
一串 0 表示區(qū)塊鏈上還沒有currency合約。
使用 currency 賬戶上傳 currency合約:
./cleos set contract currency ../../contracts/currency
執(zhí)行正常會(huì)返回一個(gè) transition_id
的json字符串备韧。
同樣我們可以驗(yàn)證合約是否上傳成功:
./cleos get code currency
如果返回像下面的內(nèi)容劫樟,則表示合約上傳成功:
code hash: 9b9db1a7940503a88535517049e64467a6e8f4e9e03af15e9968ec89dd794975
在使用currency合約之前,我們需要先創(chuàng)建在發(fā)行這個(gè)currency:
./cleos push action currency create '{"issuer":"currency","maximum_supply":"1000000.0000 CUR","can_freeze":"0","can_recall":"0","can_whitelist":"0"}' --permission currency@active
./cleos push action currency issue '{"to":"currency","quantity":"1000.0000 CUR","memo":""}' --permission currency@active
接下來驗(yàn)證下currency賬戶的初始余額:
./cleos get table currency currency accounts
{
"rows": [{
"balance": "1000.0000 CUR",
"frozen": 0,
"whitelist": 1
}
],
"more": false
}
可以看到currency賬戶有了 1000的CUR织堂。
使用currency合約轉(zhuǎn)賬
使用 currency合約的 transfer action 從currency賬戶轉(zhuǎn)賬給eosio賬戶:
./cleos push action currency transfer '{"from":"currency","to":"eosio","quantity":"20.0000 CUR","memo":"my first transfer"}' --permission currency@active
如果執(zhí)行成功會(huì)有類似下面的輸出:
executed transaction: de83ee65f983be89bebd2fc5d5ba066acaadcdebdbfc15f8f1221b98f76551ea 271 bytes 109135 cycles
# currency <= currency::transfer {"from":"currency","to":"eosio","quantity":"20.0000 CUR","memo":"my first transfer"}
>> transfer
# eosio <= currency::transfer {"from":"currency","to":"eosio","quantity":"20.0000 CUR","memo":"my first transfer"}
檢查currency賬戶余額
先看下 eosio的余額情況:
./cleos get table currency eosio accounts
{
"rows": [{
"balance": "20.0000 CUR",
"frozen": 0,
"whitelist": 1
}
],
"more": false
}
可以看到eosio 賬戶已經(jīng)有 20的CUR了
在看下currency賬戶的余額:
./cleos get table currency currency accounts
{
"rows": [{
"balance": "980.0000 CUR",
"frozen": 0,
"whitelist": 1
}
],
"more": false
}
也可以看到currency 賬戶初始有 1000的CUR ,轉(zhuǎn)了20給 eosio賬戶叠艳,現(xiàn)在還剩余980 CUR。
這樣一個(gè)簡單的currency智能合約就完成了易阳。這個(gè)currency合約有點(diǎn)以太坊ERC20 token的意思附较。操作感覺也比較簡單。