美文网首页
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