智能合约代码结构

我们都知道一个智能合约其实就是一段代码,最终执行的是相应的编译器编译出的二进制代码。这个执行二进制代码的环境就叫虚拟机。如果一条区块链系统上集成了相应平台的虚拟机,就可以说这个区块链系统支持了某个平台的智能合约。

我们知道第一个实现智能合约的公链是以太坊,而以太坊实现智能合约的技术原理来源于比特币的脚本代码。比特币的脚本的运行原理是基于堆栈这种数据结构的。具体可以去看《精通比特币》的交易章节---比特币交易脚本和脚本语言。

所以一个虚拟机里最基本也是最核心的数据结构就是要实现一个堆栈(stack);如同CPU结构里的寄存器。我们知道CPU的结构包括:计算单元,存储单元,控制单元。其实一个虚拟机也是一个CPU,也包括这三个部分;在我们的代码结构中,这三个部分被封装在了ExecutionEngine这个类中。

上面的代码可以看到。其实ExecutionEngine就是控制单元。用于在不同数据栈(单元)中的数据的协调。我们介绍一下在引擎中的作用:

invocationStack: 调用栈,在调用其他函数时或调用其他合约都会有一个新的调用栈。

EvaluationStack:计算栈,相当于CPU中的计算单元。存储的是程序中的opCode指令。

AltStack:备用栈,计算栈算出的中间结果可以保存在备用栈.

table:存储单元,持久化合约代码的hash或其他数据的数据库。

从上面的代码可以看出,除了上面的基本运算单元外,还有其他数据结构,我们也简单介绍下:

crypto:区块链系统用到的加密算法。一般是ECDSA(椭圆加密)

dataContainer:触发此合约的数据对象,通常是一个交易(transaction)

state:合约指令执行结果的状态。(是否成功)

opCode:当前执行的指令码。

service:虚拟机交互层,用于一些系统指令的调用。

gas: 合约执行指定的燃料。

gasConsumed:当前已经消耗的燃料.

现在我们对相应数据的代码文件进行简单的介绍:

虚拟机代码结构图

上面的图忘记了最重要的数据结构(堆栈)在utils包中:

堆栈

有了上面的内容,基本上就是一个虚拟机了,可以执行一些简单的逻辑处理了。但是我们除了基本的运算功能之外,既然智能合约是运行在区块链上的。就要访问区块链的数据。比如:BlockChain.GetHeight();获取当前区块链的高度。这样的指令我们称为系统指令。其实这部分指令也就是上面我们介绍的交互层(service):只要我们实现相应的数据结构,就要以当作参数传入虚拟机。然后虚拟机就可以根据解析出的指令找到相应的逻辑处理。在我们的代码中是定义在了一个叫做StateReader(状态读取,就是对区块链系统的相应数据读取)的文件中

状态读取器

上面的代码只是一部分,实现的是相应的运行时状态读取和区块链数据的读取。当然,除了读取也会有写入操作,区块链中最宝贵的资源当然是空间。写入数据我们是按照字节收费的。相应的代码我们定义在stateMachine文件中。

合约的一些操作

既然提到了收费,就简单介绍下。我们的合约里是按指令收费的:

合约指令费用

OK。到这里,基本上一个虚拟机运行所需的代码结构我们基本上有了个框架。其中的细节,就是相应的虚拟机运行过程,还需要大家仔细阅读相应的源码。

你可能感兴趣的:(智能合约代码结构)