美文网首页
2018-11-26 ewasm在以太坊私有链测试

2018-11-26 ewasm在以太坊私有链测试

作者: oracle3 | 来源:发表于2018-11-26 10:40 被阅读0次

本文参考《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有值了

相关文章

网友评论

      本文标题:2018-11-26 ewasm在以太坊私有链测试

      本文链接:https://www.haomeiwen.com/subject/nxmvqqtx.html