Go-ethereum客户端搭建,完成之后,我们可以通过各种方式与节点进行交互(JavaScript Console、JSON-RPC 、web3等)。不止是以太坊,区块链的节点一般会提供一些接口,而且是JSON RPC的接口,大部分都是通过JSON RPC和节点进行交互。通过JSON RPC调功能、传数据。
实际上去call了它的一些方式。通过暴露出一些JSON RPC的协议,然后去call一些接口,所以本质上是这样来完成数据的读取和存取。JSON RPC只是一个传输通道,以太坊还有IPC的接口。把以太坊的节点跑起来之后会建立一个进程间通信的管道,通过管道来做事情。不会耦合,只是把http的管道换成了Unix的管道。
在某些应用场景下,为了接入以太坊区块链,业务系统需要调用以太坊客户端的api,将用户的交易数据发送给以太坊平台。以太坊客户端已经为外部系统提供了RPC和IPC两种api调用方式。
以RPC方式为例,使用curl命令请求的格式如下:
调用客户端命令:
假设我们要调用客户端命令eth.getBalance(),查询地址为0x407的账号的余额,命令如下:
curl --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407", "latest"],"id":1}' localhost:8123
其中:jsonrpc字段指定JSON-RPC版本号,method字段指定需要调用的api方法名,params字段为传送的参数,id为消息标识字段;
调用合约方法:
假设目前有部署的智能合约,地址为0x6ff93,我们要调用的合约方法签名为multiply(uint256),传入的参数值为6,那么调用命令的格式如下:
curl --data
{
"jsonrpc":“2.0”,
"method":“eth_sendtransaction”,
"params"[{
"from":"0xeb85a5",
"to":"0x6ff93",
"data":"0xcddddd"
}]
"id":8}
localhost:8123
其中,from为扣除GAS的账户地址,to为智能合约部署的地址,data为调用方法的签名和传入参数,编码方式为:
“0x”+sha3(“multiply(uint256)”).substring(0,8)+to_32bit_Hex_str(6)
to_32bit_Hex_str()方法的实现会依据不同的变量类型而有不同,具体规则可以参考Ethereum Contract ABI 文档(HERE)。
从上面的示例可以看出,从外部对智能合约的调用需要进行复杂的编码。万幸,目前以太坊官方提供了使用javascript语言实现的web3.js模块,对RPC和IPC两种调用方式都进行了封装,对外提供了简洁的接口,使用非常方便。
下面本文将使用web3.js模块在nodejs环境下实现对智能合约的调用,并向外提供RESTful的api。详情如下:
系统环境:
Ubuntu14.04.4+Node V5.1.1;
需要引入的Node模块
express、web3、net,可以使用npm命令安装依赖;
主要代码片段
引入模块依赖
var express =require('express');
var Web3=require(' Web3');
var net=require('net');
设置RPC和IPC连接对象
具体查看这里写链接内容
调用以太坊客户端方法,查询指定账户的余额
新建以太坊账户,该方法必须使用IPC api的调用方式
新建合约对象,其中contractData为合约代码编译后的16进制字符串
调用智能合约方法
开启http server
最后使用node启动服务,看到“Example app listening at http://:::9090”服务就启动成功了。这样用户便可通过RESTful的http请求来与以太坊客户端进行交互,并调用智能合约。
计算programming?应用的计算实际上分为了两种,1.在evm上运行的计算,也是以太坊的核心目标。这些高级语言使用刚才所说的如solidity来写,写出来就是一个合约或说是程序。一个合约等价于一个class的概念,里面可有很多function等价于class里面很多的method。合约写完后可以调用JSON RPC的接口,把它编译成evm上的opcodes,然后部署到以太坊的网络上,这样以太坊就可以进行这个合约,跑起来这个程序。2.用JS或者传统方法写的东西,因一个程序里不是所有的都需要放在区块链上,可能只有你最关心的业务逻辑如转账需放在区块链上来保证它的公开透明可执行。其他的如显示账户里的金额,可以通过JSON RPC另外的接口给节点发请求,告诉我这个地址上账户里余额多少。这样收到的response就会包含这个信息,就会显示在界面上。如果自己写了些逻辑在区块链上,类比成数据库的话有点像procedure,trigger,实际上去call这个存储过程,它做了些运算,然后把结果放在数据库上面。有两类计算,并不是所有的计算都交给区块链的。所以假设我有一个普通的网站,后面有server,背后既有数据库又有blockchain。有些东西存在数据库,有些存在blockchain,也没有问题,因为满足不同的需求。所以只需要证明在blockchain上不能更改的一些重要的东西,一些和内部业务相关的,一些不那么重要但经常读取的就可以放在数据库里。所以对于开发人员来讲是多了一个武器。
智能合约的外部调用