本文参考《ewasm/testnet》,《Ewasm community hangout》整理如下:
1、ewasm私有链的搭建
开发环境:virtualbox虚拟机 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虚拟机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
显示如下内容:
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 启动私有链
./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 配置私有链
再启动一个终端,执行
./geth attach $HOME/testnet/ewasm-testnet-data/geth1.ipc
创建两个账号:
personal.newAccount("123")
personal.newAccount("123")
配置coinbase
miner.setEtherbase(eth.accounts[0])
挖矿
miner.start()
查看账号信息:
eth.getBalance(eth.accounts[0])
2、metamask的安装和连接到私有链
打开https://metamask.io/安装chrome插件
安装成功后,在浏览器工具栏出现一个小狐狸的图标
点击小狐狸,注册登录后,在右上角网络中选择localhost 8545
选择右上角的圆饼图标,导入账号,类型选择jsonfile,选择目录上上面创建的ewasm-testnet-data下keystore目录下,导入成功后,显示当前账号以太币(如果开始挖矿了,这个地址是有币的),当前账号地址:0xD1726624591b577E1DBa12b770A8762f101d35a5(这个每个人的不一样,只是为了和下面的对应)
3、ewasm合约的发布和调用
3.1 发布合约
打开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))
然后点击submit transaction
打开了metamask窗口,确认提交,获得交易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 调用合约
打开http://ewasm.ethereum.org/studio/
Destination Address输入:0x4d913aafa689a69307fef8b5e066166a82be422f (这个就是上面获取的合约地址)
value输入:10000
Contract Code (WAST)输入空
然后点击submit transaction
打开了metamask窗口,确认提交,获得交易hash:0xbde239cd7c48f422070f43a9c586c43c79789ef2bbebc9de403c02eb1aafc281
在私有链上还没有找到方法查看当前合约执行的结果
solidity是通过abi调用查看接口,这里还没有搞明白,不过后面如果不是有私有链,而是是有以太坊提供的ewasm testnet就可以查看
4、使用ewasm testnet发布和调用合约
4.1 设置metamask调用ewasm testnet
选择private network,在new rpc url中填入:
http://ewasm.ethereum.org:8545
选择save
查看当前metamask帐号的地址:
0xD1726624591b577E1DBa12b770A8762f101d35a5
打开http://ewasm.ethereum.org/faucet/
查看user下的地址,应该也是0xD1726624591b577E1DBa12b770A8762f101d35a5
如果不是就需要在metamask的设置里面reset Account
选择request 1 ether from faucet,给自己的账户转1个以太币
在http://ewasm.ethereum.org/explorer/查看Recent Transactions,这里显示了刚才的转账信息
查看metamask的账户已经有了1 eth
4.2 发布合约
打开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))
然后点击submit transaction
打开了metamask窗口,确认提交
在http://ewasm.ethereum.org/explorer找到交易:
http://ewasm.ethereum.org/explorer/tx/0xc53eef833c124ce0532d945ea08fcf740aba3ca410b7a77daed417079d711465
查看合约:http://ewasm.ethereum.org/explorer/account/0x30E54056A60C70a1548ff4589ADA634dd0119aa3
4.3 调用合约:
打开http://ewasm.ethereum.org/studio/
Destination Address输入:0x30E54056A60C70a1548ff4589ADA634dd0119aa3
value输入:10000
Contract Code (WAST)输入空
然后点击submit transaction
打开了metamask窗口,确认提交
同样查看合约:http://ewasm.ethereum.org/explorer/account/0x30E54056A60C70a1548ff4589ADA634dd0119aa3
这个时候Storage有值了
网友评论