本文參考《ewasm/testnet》雀监,《Ewasm community hangout》整理如下:
1辈灼、ewasm私有鏈的搭建
開發(fā)環(huán)境:virtualbox虛擬機(jī) Ubuntu18.0
1.1 編譯ewasm版本的go ethereum
mkdir testnet
cd?testnet
go get -u -v github.com/ethereum/go-ethereum
git clone https://github.com/ewasm/go-ethereum -b ewasm-testnet-milestone1
cd go-ethereum
make geth
cd ..
cp go-ethereum/build/bin/geth .
1.2 編譯ewasm虛擬機(jī)hera
git clone https://github.com/ewasm/hera --recursive -b ewasm-testnet-milestone1
cd hera
mkdir build && cd build
cmake .. -DBUILD_SHARED_LIBS=ON
cmake --build .
cd ../../
cp hera/build/src/libhera.so .
1.3 拉取初始化配置
wget https://raw.githubusercontent.com/ewasm/testnet/master/ewasm-testnet-geth-config.json
ls?
顯示如下內(nèi)容:
ewasm-testnet-geth-config.json geth go-ethereum hera libhera.so
1.4 初始化私有鏈
./geth --datadir ewasm-testnet-data init ewasm-testnet-geth-config.json
1.5 啟動(dòng)私有鏈
./geth \
--vm.ewasm="$HOME/testnet/libhera.so,metering=true,fallback=true" \
--datadir ewasm-testnet-data \
--rpc --rpcapi "web3,net,eth,debug" \
--rpcvhosts="*" --rpcaddr "0.0.0.0" \
--rpccorsdomain "*" \
--nodiscover \
--networkid 66 \
--ipcpath geth1.ipc console
1.6 配置私有鏈
再啟動(dòng)一個(gè)終端旬牲,執(zhí)行
./geth attach $HOME/testnet/ewasm-testnet-data/geth1.ipc
創(chuàng)建兩個(gè)賬號(hào):
personal.newAccount("123")
personal.newAccount("123")
配置coinbase
miner.setEtherbase(eth.accounts[0])
挖礦
miner.start()
查看賬號(hào)信息:
eth.getBalance(eth.accounts[0])
2、metamask的安裝和連接到私有鏈
打開https://metamask.io/安裝chrome插件
安裝成功后蚤吹,在瀏覽器工具欄出現(xiàn)一個(gè)小狐貍的圖標(biāo)
點(diǎn)擊小狐貍球榆,注冊(cè)登錄后,在右上角網(wǎng)絡(luò)中選擇localhost 8545
選擇右上角的圓餅圖標(biāo)菇民,導(dǎo)入賬號(hào)尽楔,類型選擇jsonfile,選擇目錄上上面創(chuàng)建的ewasm-testnet-data下keystore目錄下第练,導(dǎo)入成功后阔馋,顯示當(dāng)前賬號(hào)以太幣(如果開始挖礦了,這個(gè)地址是有幣的)娇掏,當(dāng)前賬號(hào)地址:0xD1726624591b577E1DBa12b770A8762f101d35a5(這個(gè)每個(gè)人的不一樣呕寝,只是為了和下面的對(duì)應(yīng))
3、ewasm合約的發(fā)布和調(diào)用
3.1 發(fā)布合約
打開http://ewasm.ethereum.org/studio/
value輸入:10000
Contract Code (WAST)輸入:
(module
? (type $t0 (func (param i32 i32)))
? (type $t1 (func (result i64)))
? (type $t2 (func))
? (type $t3 (func (param i64)))
? (import "ethereum" "storageStore" (func $ethereum.storageStore (type $t0)))
? (import "ethereum" "storageLoad" (func $ethereum.storageLoad (type $t0)))
? (import "ethereum" "getBlockNumber" (func $ethereum.getBlockNumber (type $t1)))
? (import "ethereum" "useGas" (func $ethereum.useGas (type $t3)))
? (func $main (export "main") (type $t2)
? ? (call $ethereum.useGas
? ? ? (i64.const 19))
? ? (i32.store
? ? ? (i32.const 512)
? ? ? (i32.const 88))
? ? (i32.store
? ? ? (i32.const 1024)
? ? ? (i32.const 99))
? ? (i64.store
? ? ? (i32.const 32)
? ? ? (call $ethereum.getBlockNumber))
? ? (call $ethereum.storageStore
? ? ? (i32.const 512)
? ? ? (i32.const 32))
? ? (call $ethereum.storageLoad
? ? ? (i32.const 512)
? ? ? (i32.const 2048))
? ? (call $ethereum.storageStore
? ? ? (i32.const 1024)
? ? ? (i32.const 2048)))
? (memory $memory (export "memory") 1))
然后點(diǎn)擊submit transaction
打開了metamask窗口婴梧,確認(rèn)提交下梢,獲得交易hash:0xf55fc03132aab55593f10a022db330c36e75812775637b21317aff0262d20c2a
3.2 查詢合約信息
打開geth客戶端:
./geth attach http://127.0.0.1:8545
查看合約交易:
eth.getTransactionReceipt("0xf55fc03132aab55593f10a022db330c36e75812775637b21317aff0262d20c2a")
獲得合約地址:
{ blockHash:"0x2c2fab382202ad475fdf0fd73070e8272d34d6665025570f339df029afbe2955", blockNumber:1976, contractAddress:"0x4d913aafa689a69307fef8b5e066166a82be422f", cumulativeGasUsed:119736, from:"0x12cb7d4e35a280e27e9b7061dc41b9cacd93be85", gasUsed:119736, logs: [], logsBloom:"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", status:"0x1", to:null, transactionHash:"0xf55fc03132aab55593f10a022db330c36e75812775637b21317aff0262d20c2a", transactionIndex:0}
其中合約地址是0x4d913aafa689a69307fef8b5e066166a82be422f
獲得合約代碼:
eth.getCode("0x4d913aafa689a69307fef8b5e066166a82be422f")
3.3 調(diào)用合約
打開http://ewasm.ethereum.org/studio/
Destination Address輸入:0x4d913aafa689a69307fef8b5e066166a82be422f (這個(gè)就是上面獲取的合約地址)
value輸入:10000
Contract Code (WAST)輸入空
然后點(diǎn)擊submit transaction
打開了metamask窗口客蹋,確認(rèn)提交,獲得交易hash:0xbde239cd7c48f422070f43a9c586c43c79789ef2bbebc9de403c02eb1aafc281
在私有鏈上還沒有找到方法查看當(dāng)前合約執(zhí)行的結(jié)果
solidity是通過abi調(diào)用查看接口孽江,這里還沒有搞明白讶坯,不過后面如果不是有私有鏈,而是是有以太坊提供的ewasm testnet就可以查看
4岗屏、使用ewasm testnet發(fā)布和調(diào)用合約
4.1 設(shè)置metamask調(diào)用ewasm testnet
選擇private network辆琅,在new rpc url中填入:
http://ewasm.ethereum.org:8545
選擇save
查看當(dāng)前metamask帳號(hào)的地址:
0xD1726624591b577E1DBa12b770A8762f101d35a5
打開http://ewasm.ethereum.org/faucet/
查看user下的地址,應(yīng)該也是0xD1726624591b577E1DBa12b770A8762f101d35a5
如果不是就需要在metamask的設(shè)置里面reset Account
選擇request 1 ether from faucet这刷,給自己的賬戶轉(zhuǎn)1個(gè)以太幣
在http://ewasm.ethereum.org/explorer/查看Recent Transactions婉烟,這里顯示了剛才的轉(zhuǎn)賬信息
查看metamask的賬戶已經(jīng)有了1 eth
4.2 發(fā)布合約
打開http://ewasm.ethereum.org/studio/
value輸入:10000
Contract Code (WAST)輸入:
(module
? (type $t0 (func (param i32 i32)))
? (type $t1 (func (result i64)))
? (type $t2 (func))
? (type $t3 (func (param i64)))
? (import "ethereum" "storageStore" (func $ethereum.storageStore (type $t0)))
? (import "ethereum" "storageLoad" (func $ethereum.storageLoad (type $t0)))
? (import "ethereum" "getBlockNumber" (func $ethereum.getBlockNumber (type $t1)))
? (import "ethereum" "useGas" (func $ethereum.useGas (type $t3)))
? (func $main (export "main") (type $t2)
? ? (call $ethereum.useGas
? ? ? (i64.const 19))
? ? (i32.store
? ? ? (i32.const 512)
? ? ? (i32.const 88))
? ? (i32.store
? ? ? (i32.const 1024)
? ? ? (i32.const 99))
? ? (i64.store
? ? ? (i32.const 32)
? ? ? (call $ethereum.getBlockNumber))
? ? (call $ethereum.storageStore
? ? ? (i32.const 512)
? ? ? (i32.const 32))
? ? (call $ethereum.storageLoad
? ? ? (i32.const 512)
? ? ? (i32.const 2048))
? ? (call $ethereum.storageStore
? ? ? (i32.const 1024)
? ? ? (i32.const 2048)))
? (memory $memory (export "memory") 1))
然后點(diǎn)擊submit transaction
打開了metamask窗口,確認(rèn)提交
在http://ewasm.ethereum.org/explorer找到交易:
http://ewasm.ethereum.org/explorer/tx/0xc53eef833c124ce0532d945ea08fcf740aba3ca410b7a77daed417079d711465
查看合約:http://ewasm.ethereum.org/explorer/account/0x30E54056A60C70a1548ff4589ADA634dd0119aa3
4.3 調(diào)用合約:
打開http://ewasm.ethereum.org/studio/
Destination Address輸入:0x30E54056A60C70a1548ff4589ADA634dd0119aa3
value輸入:10000
Contract Code (WAST)輸入空
然后點(diǎn)擊submit transaction
打開了metamask窗口崭歧,確認(rèn)提交
同樣查看合約:http://ewasm.ethereum.org/explorer/account/0x30E54056A60C70a1548ff4589ADA634dd0119aa3
這個(gè)時(shí)候Storage有值了