java编写智能合约_区块链实现JAVA语言智能合约的设计方案简介

以太坊相对比特币很大的一个改进是其引入了智能合约,做到了平台与业务的分离。智能合约实现各种业务逻辑,区块链平台提升性能与易用性。

Java语言智能合约的优势

目前主流的智能合约开发语言是以太坊的solidity、EOS的WASM等,流行度、社区完善度有点欠缺。相对来说JAVA会好很多,而且对比solidity,还有以下几个优势:

1. 性能高:

a. Solidity每32字节一次IO, 比如智能合约上有个String字符串有1000个字节,在智能合约使用这个字符串之前系统实际做了1000/32 = 32次的IO。这是制约智能合约性能非常大的一个问题。 而java就没有这个限制,一次IO就读取到完整数据。

b. Solidity是解释性语言,一个solidity指令要解释成N多条java代码执行(使用java语言实现的evm), 性能会打点折扣。Java是通过javac编译成字节码了,可以直接在jvm上执行。

2. 功能强大:

a. Solidity能提供的函数目前还很少,一些复杂的处理逻辑实现起来比较困难,比如在智能合约实现签名验证等。而java类库众多,可以很轻松实现这些逻辑。

Java语言智能合约存在的主要问题

我们知道区块链是去中心的可信环境,每个全节点都需要执行智能合约,而且每台全节点智能合约执行结果是必须一致的,这就要求智能合约必须是状态机。这就对java等高级语言提出了更多要求。在不改变jdk、jre基础上,需要注意以下几点:

1. 禁止使用非状态机函数:在智能合约中必须保证无论何时何地何种情况,执行结果必须一致。Java语言中random、system等就不允许使用

2. 智能合约全局变量使用过程中需顾及Java引用机制可能造成的数据污染:智能合约中把全局对象赋值给局部变量时,可能会出现由于使用不当导致临时修改的局部变量反应到全局变量中。

Java语言智能合约设计实现方案简介

整个方案分成提供给开发者开发智能合约的开发工具,和区块链JVM平台这两方面。

1. 智能合约开发工具

a. 需要定义一些基础工具类,主要是合约数据库的读写接口,比如key-value存储。

b. 需要定义只读函数调用(类似以太坊的local交易)和event事件。利用java的注解Annotation机制来定义。

c. 需要引入执行的变量,比如交易执行的blocknum、timestamp等值

d. 需要提供脚本对智能合约的java类做封装,抽象出合约部署、合约加载、交易上链、事件监听等方法,方便调用方调用。类似web3j对solidity的封装。

2. 链上智能合约JVM平台

a. 合约部署时,需识别出是否在合约中使用了非状态机函数。核心就是整理出一份非状态机函数,比如random、system等,再用ASM扫描识别。用ASM实现Gas收费计算和event事件实现。

b. 智能合约全局变量使用时,每次都必须重新反序列化成对象,类似深拷贝,防止被污染。

c. 序列化:自定义合约对象必须用java自带的Serializable做序列化,因为自定义合约对象里面可能有对象的引用,在反序列化后也得继续保持是引用关系。其他存入DB的可以用rlp序列化反序列化机制,因为rlp序列化性能是Serializable序列化性能的10 倍。

你可能感兴趣的:(java编写智能合约)