0731Report

JunmingKe

上一次我谈到接下来的计划主要有四个方面:

7月的最后一天,解决了两个比较重要的开发问题 😃

利用服务器访问rpc暴露的接口,供开发客户端使用

首先需要选择一款HTTP调试工具,我一开始用的JQuery写了一个html,调用$.ajaxpost接口,但是有很多问题,包括:header中声明字段是json格式,需要修改传输协议;客户端访问是不允许跨域请求的,但服务器端范围就不会有这种问题(这个问题后来我发现只需要在启动时加上geth --rpc --rpccorsdomain "http://localhost:3000"这种指令就可以了。)等等。这些问题都可以通过node搭个服务器解决,后期开发应用也需要进行这一步,但现在主要还是测试阶段,所以我选择了HTTP测试工具:

接下来详细讲述访问过程:

首先,Geth已经提供了RPC(Remote Procedure Call)服务接口,只需要在启动节点时加上--rpcGeth会自动在localhost:8545端口开启访问接口。如果需要调整端口,加上--rpcaddr <ip> --rpcport <portnumber>更改<ip><portnumber>即可。

更多选项参数参考http://www.mamicode.com/info-detail-2166090.html

image

其中--rpcapi是设置可以调用的接口有哪些,这里设置的是db,eth,net,web3,personal

打开POSTMAN,POST后面网址填上127.0.0.1:8545,Headers里面的keyvalue分别填上:Content-Typeapplication/json。在Body中填上以下代码:

{
    "jsonrpc":"2.0",
    "method":"eth_getTransactionByHash",
    "params":
    [
        "0xd73a04a93a08461dbb56581aced7bd8ded114cea172f409cc824a0b0caa96eda"
    ],
    "id":67
}

jsonrpcid都是标识符,methodparams分别是调用的方法和传入的参数。结果如下图:

image

下面的body是从Geth传出的数组,里面包含了交易的所有参数,如果客户端或者服务器接收到这些数据,可以拿来操作。

可以看出,调用的方法methodweb3不一致,这是因为rpcweb3是不同的层,具体的分层还需要再分析源码,但rpc暴露的method都在go-ethereum/blob/master/ethclient/ethclient.go中有所体现,这也是下一步计划要做的地方。

web3部署智能合约

具体的合约的编写和合约的内容可以自行查阅资料或者私下讨论,这里不再详细讨论。

web3已经摒弃了compile命令,所以具体的solidity需要在http://remix.ethereum.org/里写好,点击右边的Start to compile,没有问题再点Details

image

在弹出的页面里,有个WEB3DEPLOY,复制下来,转到控制台。

image

粘贴,运行,就把合约部署出去了。需要注意的是,此时只是发布了合约,还没有写进块里,需要运行miner.start(),写进块里之后,由于在合约里有一个console的操作,所以控制台会提示你已经写进块里了。

此时,所有人都可以调用合约,调用合约有两种方式,一种是call(),这种是把合约拿来算一个东西并返回给自己,不需要写进链里;还有一种是sendTransaction(),这种是把合约拿来算一个东西并把结果返回到区块链上,需要链上记录数据,比如转账这种操作。

下图的plusVaule是在合约里定义的函数,传入两个账户,用来计算两个账户的总金额,这种不需要写进链里,则调用方法为:

metacoin.plusValue.call(web3.eth.accounts[0],web3.eth.accounts[1])

getBalance的作用是传入一个账户,传回该账户的金额:

metacoin.getBalance.call(web3.eth.accounts[0])

image

以上两种调用方式都是call方法,利用web3来实现转账功能,具体代码如下:

metacoin.sendCoin.sendTransaction(web3.eth.accounts[1],1000,{from:web3.eth.accounts[0]})

运行结果如下所示,可以看到,miner.start()之前金额是不变的,是因为交易还没有写进链里。
image

至此,合约的部署和调用就做完了,但我发现合约写入的时候是在data里,读取的时候是写在input里面的,具体的为什么我还没搞清楚。

下一步计划

  1. 查看pending状态的交易或利用P2P网络传输消息
  2. https://github.com/ethereum/go-ethereum/blob/master/ethclient/ethclient.go
    测试每一个eth_开头的接口的调用格式。
  3. web3.db
  4. 多节点测试
  5. gas要怎么设置
  6. inputdata区别在哪