web3j以太坊智能合约流程浅析

这次的项目,主要在智能合约开发上。这里简单讲讲隐藏在合约下面的一些东西。solidity合约的编写以及逻辑处理,请自行度娘。


1、web3j
web3j是一套访问以太坊http rpc服务的java sdk。有什么业务,主要看etherum-harmony提供的接口,而不是以太坊有什么服务。以太坊提供的服务比较简单,只有转账,存证和EVM执行。
而假如去看web3j的通讯代码,你可以看到,很多和合约相关的调用,都是通过转账接口完成的,在转账接口中附加了业务参数,然后rpc服务器解析业务参数进行业务处理。
web3j的创建和使用有TransactionManager以及ScheduledExecutorService可以自定义,可以用来定义连接超时,nonce规则,刷新频率等。


2、合约部署(这里不讲solc编译部分,自行度娘)
智能合约在链上的表现形式就是一段编译的二进制编码,web3j将生成的二进制文件,send到以太坊去保存。
【web3j以太坊智能合约流程浅析】以太坊产生合约地址,并保存二进制数据,可供后面合约调用。


3、合约加载
合约加载,web3j提供了友好的java函数接口可以加载调用,但是内部的逻辑,是加载函数调用接口abi的映射。一个abi可以对应一个具体的方法+参数。
从这点我们也可以知道两个点。一、假如合约的地址不对(对应的是二进制代码不对),加载是可以成功,但是由于映射是错误的,所以调用会出现问题。二、合约的加载是本地的,依赖的是本地的代码或者abi文件等,不需要去以太坊获取。


4、合约调用
web3j中合约调用分两步:先是将请求封装好,用sendRawTransaction发送到链上。然后用得到的transactionhash去轮询结果transactionReceipt。
请求封装合约加载完成,就可以按照abi的设定,进行方法调用。web3j这边的处理逻辑,是将参数按照格式封装,大致是合约地址,合约abi签名,参数段,这样。
以太坊接受到请求以后,解析请求参数,读取之前保存的合约二进制代码,再读取函数内容,从而进行一步步调用。比如得到命令0x**,进行转账, 0x**进行判断这么一个概念。
在合约调用中,其实内部会有多次的合约调用,转账等,而这些,是不会展示在外层的合约调用中的,block打包的交易只有最外层的那个调用。
PS:这里有个坑是这样的,假如合约执行失败(比如合约不存在),receipt还是会产生。为什么会这样呢?因为合约调用是一次交易,和evm的执行是分开的。所以,给一个空地址或者过期合约转账是会成功的,这点很重要。当你把一个合约给销毁以后,继续调用合约的内容,还是会扣钱的,所以我们想的方法是,给合约一个状态,但不去销毁它,用状态来做错误处理。或者你需要先调用getCode方法去检查合约地址是否合法。


5、合约消息
除了合约调用,合约的另一个领域是消息。
web3j中的消息,是去rpc服务器中创建一个logfilter()。创建完成以后,起一个observer监听,间隔一定时间,去查下filterchange的内容。
在以太坊中合约调用以后,会将合约的消息,写入logs字段。rpc服务利用bloomfilter过滤block中的log,并将匹配的log发送到filter中。等到有filterchange查询来临,就将log发送出去。
web3j接收到新的log内容,将其转化为java的event对象,并回调给监听observer,由其处理event。


大概就是这些。这篇是第一篇,也可能最后一篇写区块链的文章。后续就从项目组离开了,不知道还能不能接触了。

    推荐阅读