其他分享
首页 > 其他分享> > 区块链 Fisco bcos 智能合约(11)-深入浅出Solidity

区块链 Fisco bcos 智能合约(11)-深入浅出Solidity

作者:互联网

在只有比特币的年代,区块链能够实现简单的价值产生和转移,但却未出现更多的商业模式。

以太坊给区块链带来了维度的提升,基于区块链的应用渐趋丰富,区块链的各种商业模式加速涌现。

这其中很重要的原因,是以太坊给区块链带来了一套图灵完备的编程语言。

区块链的主要功能,是实现了多方的共识。

 

 

  Solidity 介绍

 

Solidity语言和Java存在着些许相似之处。

在众多编程语言中,Java是发展较为成熟的。

Java代码在Java虚拟机(JVM)执行。

JVM屏蔽掉了操作系统的差异,使得Java成为一个跨平台的语言。一套Java代码可在Windows、Linux、Mac上通用,而不需要关心操作系统的差异。

 

Solidity与Java类似。代码写好后,都需要通过编译器将代码转换成二进制。

 

生成后的二进制代码,会放到虚拟机里执行。

 

 

图片

 

Solidity与Java的不同之处在于,Solidity是服务于区块链的语言,代码在区块链上执行。

 

Solidity的设计目的,是给区块链提供一套统一的逻辑,让相同的代码跑在区块链的每个节点上,借助共识算法,让区块链的数据以统一的方式进行改变,达到全局一致的结果。

 

 

  Solidity 实现细节

 

以此处的Demo合约为例,合约中有一个全局变量m,并有一个函数add(),实现给全局变量m增加x数值的功能。

 

图片

 

通过合约编译器solc,可将此合约编译成二进制。

二进制的每个字(8 bit),表示一个EVM的操作码(OPCODE)。

 

Demo合约编译出的二进制及其相应的OPCODE如下,实现了完整的Demo合约的功能,包括

其中,标红部分是add()方法的实现。

 

图片

 

将add()函数的OPCODE的标红部分摘取出来,可看到其具体的实现思想与汇编代码相同,是一种基于堆栈式的操作。

 

其中的

图片

图片

 

 

EVM执行合约代码,从区块链上读入当前区块的数据,进行相加操作,并将结果写入下一个区块(等待共识的区块)对应的状态数据中。

 

此后,共识算法将待执行的区块共识落盘,区块高度增加,区块链上的数据完成更新。

 

图片

 

上述步骤可见,Solidity的实现与当今已有的做法有着很多相似之处。

 

 

  Solidity 局限与改进

 

Solidity由于是第一个大规模应用的智能合约语言,存在着一些有待改进的地方。

 

Solidity不够灵活。

 

Solidity的性能较差。

在执行上,OPCODE的执行是一种用程序模拟的汇编执行器,而不是直接使用CPU的资源。

(因为opcode由evm执行,但evm是计算机上的一个程序,evm本身的代码是要在cpu上运行时,因此说,不直接使用cpu资源)

在存储上,Solidity的底层存储单位是32字节(256 bits),对硬盘的读写要求较高,浪费了大量的存储资源。

 

针对上述两点,FISCO BCOS提供了一种用C++写合约方式:预编译合约。开发者可以用C++编写智能合约逻辑,并将其内置在节点中。

 

预编译合约的调用方法与Solidity合约相同,通过合约地址即可直接调用。FISCO BCOS提供了参数解析,将调用的参数解析成C++可识别的格式。

 

预编译合约突破了Solidity语言的限制,借助强大的C++语言,可以灵活的实现各种逻辑,灵活性大大提高。同时,C++的性能优势也得到了很好的利用,通过预编译合约编写的逻辑,相比于Solidity语言来说,性能得到提升。

标签:11,Java,Fisco,代码,Solidity,区块,合约,EVM
来源: https://blog.51cto.com/shijianfeng/2965329