上一次我谈到接下来的计划主要有四个方面:
web3.db
web3
部署智能合约pending
状态的交易或利用P2P网络传输消息rpc
暴露的接口,供开发客户端使用7月的最后一天,解决了两个比较重要的开发问题 😃
rpc
暴露的接口,供开发客户端使用首先需要选择一款HTTP调试工具,我一开始用的JQuery
写了一个html,调用$.ajax
去post
接口,但是有很多问题,包括:header
中声明字段是json
格式,需要修改传输协议;客户端访问是不允许跨域请求的,但服务器端范围就不会有这种问题(这个问题后来我发现只需要在启动时加上geth --rpc --rpccorsdomain "http://localhost:3000"
这种指令就可以了。)等等。这些问题都可以通过node
搭个服务器解决,后期开发应用也需要进行这一步,但现在主要还是测试阶段,所以我选择了HTTP测试工具:
接下来详细讲述访问过程:
首先,Geth
已经提供了RPC(Remote Procedure Call)服务接口,只需要在启动节点时加上--rpc
,Geth
会自动在localhost:8545
端口开启访问接口。如果需要调整端口,加上--rpcaddr <ip> --rpcport <portnumber>
更改<ip>
和<portnumber>
即可。
更多选项参数参考http://www.mamicode.com/info-detail-2166090.html
。
其中--rpcapi
是设置可以调用的接口有哪些,这里设置的是db,eth,net,web3,personal
。
打开POSTMAN,POST后面网址填上127.0.0.1:8545
,Headers
里面的key
和value
分别填上:Content-Type
和application/json
。在Body
中填上以下代码:
{
"jsonrpc":"2.0",
"method":"eth_getTransactionByHash",
"params":
[
"0xd73a04a93a08461dbb56581aced7bd8ded114cea172f409cc824a0b0caa96eda"
],
"id":67
}
jsonrpc
和id
都是标识符,method
和params
分别是调用的方法和传入的参数。结果如下图:
下面的body
是从Geth
传出的数组,里面包含了交易的所有参数,如果客户端或者服务器接收到这些数据,可以拿来操作。
可以看出,调用的方法method
和web3
不一致,这是因为rpc
和web3
是不同的层,具体的分层还需要再分析源码,但rpc
暴露的method
都在go-ethereum/blob/master/ethclient/ethclient.go
中有所体现,这也是下一步计划要做的地方。
web3
部署智能合约具体的合约的编写和合约的内容可以自行查阅资料或者私下讨论,这里不再详细讨论。
web3
已经摒弃了compile
命令,所以具体的solidity
需要在http://remix.ethereum.org/
里写好,点击右边的Start to compile
,没有问题再点Details
。
在弹出的页面里,有个WEB3DEPLOY
,复制下来,转到控制台。
粘贴,运行,就把合约部署出去了。需要注意的是,此时只是发布了合约,还没有写进块里,需要运行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])
以上两种调用方式都是call
方法,利用web3
来实现转账功能,具体代码如下:
metacoin.sendCoin.sendTransaction(web3.eth.accounts[1],1000,{from:web3.eth.accounts[0]})
运行结果如下所示,可以看到,miner.start()
之前金额是不变的,是因为交易还没有写进链里。
至此,合约的部署和调用就做完了,但我发现合约写入的时候是在data
里,读取的时候是写在input
里面的,具体的为什么我还没搞清楚。
pending
状态的交易或利用P2P网络传输消息eth_
开头的接口的调用格式。web3.db
input
和data
区别在哪