以太坊智能合约

1.智能合约

智能合约是由尼克萨博提出的理念,几乎与互联网同龄。但是由于缺少可信的执行环境,智能合约并没有被应用到实际产业中。自从比特币诞生后,人们认识到比特币的底层技术区块链天生可以为智能合约提供可信的执行环境
,以太坊首先实现了区块链和智能合约的完整契合。

以太坊是内置有图灵完备 [1] 编程语言的区块链,通过建立抽象的基础层,使得任何人都能够创建合约和去中心化应用,并在其中设立他们自由定义的所有权规则、交易方式和状态转换函数。建立一个代币的主体框架只需要两
行代码就可以实现,诸如货币和信誉系统等其他协议只需要不到20行代码就可以实现。智能合约就像能在以太坊的平台上创建的包含价值而且只有满足某些条件才能打开的加密箱子,并且因为图灵完备性、价值意识(value-
awareness)、区块链意识(blockchain-awareness)和记录多状态所增加的功能而比比特币脚本所能提供的智能合约强大得多。

2.开发语言

以太坊的软件开发语言是其最大特性之一,因为对区块链进行编程是一项首要目标。以太坊具有4种专用语言:Serpent(受Python启发)、Solidity(受JavaScript启发)、Mutan(受Go启发)和LLL(受Lisp启发),都是为
面向合约编程而从底层开始设计的语言。

作为以太坊的高级编程语言,Serpent的设计非常类似于Python。它被设计为最大可能地简洁和简单,将低级语言的高效优势与编程风格中的易用性相结合。

Solidity是以太坊的首选语言,它内置了Serpent的所有特性,但是语法类似于JavaScript。Solidity充分利用了现有数以百万程序员已掌握JavaScript这一现状,降低了学习门槛,易于被掌握和使用。

以太坊区块链的另一关键特征是它的“图灵完备性”,这保证了以太坊可以解决所有的计算问题。更加准确地说,它是“半”图灵完备的,因为它是通过对计算量设置上限,它避免了完全图灵完备语言存在的无法停机问题。此
外,因为以太坊的语言是为区块链专门设计的,它有账户的概念,使得它在交易的可视化和查询账户状态方面提供了实时性。这是一个受人欢迎的功能,但对比特币而言实现起来具有一定的挑战。在比特币上,由于只有UTXO而
没有账户的概念,我们需要导入区块链数据库,解析所有的交易,并为了抽取出在区块链上的某个用户的交易情况而查询交易。而用以太坊,我们则可以在实时的区块链上,根据一个地址情况实时查看当前账户情况和交易状态

3.代码执行

以太坊合约的代码是使用低级的基于堆栈的字节码的语言写成的,被称为“以太坊虚拟机代码”或者“EVM代码”。代码由一系列字节构成,每一个字节代表一种操作。一般而言,代码执行是无限循环,程序计数器每增加一(初
始值为零)就执行一次操作,直到代码执行完毕或者遇到错误、STOP或者RETURN指令。操作可以访问3种存储数据的空间:

1)堆栈,一种后进先出的数据存储,入栈、出栈的基本单位为32字节。

2)内存,可无限扩展的字节队列。

3)合约的长期存储,一个密钥/数值的存储,其中密钥和数值都是32字节大小。与计算结束即重置的堆栈和内存不同,存储内容将长期保持。

代码可以像访问区块头数据一样访问数值、发送和接收到的消息中的数据,代码还可以返回数据的字节队列作为输出。EVM代码的正式执行模型非常简单。当以太坊虚拟机运行时,它的完整的计算状态可以由元组(block_state
,transaction,message,code,memory,stack,pc,gas)来定义,这里block_state是包含所有账户余额和存储的全局状态。每轮执行时,通过调出代码的第pc(程序计数器)个字节,每个指令如何影响元组都有定义。例
如,ADD将两个元素出栈并将它们的和入栈,将Gas减1并将pc加1;stack将顶部的两个元素出栈,并将第2个元素插入由第1个元素定义的合约存储位置,同样减少最多200的Gas值,并将pc加1。虽然有许多方法通过即时编译去优
化以太坊,但以太坊的基础性的实施可以用几百行代码实现。

猜你喜欢

转载自www.cnblogs.com/cxyzt/p/8915755.html