智能合约

一、什么是智能合约?

智能合约这个术语已经在过去数十年被用于描述不同领域的事物。

在20世纪90年代,密码学家Nick Szabo定义了这个术语,并把它定义为“一系列承诺,通过数字化形式定义,包括一组协议和在协议中的各方执行的其他承诺”。

在这里,我们将智能合约指代那些不可改变的计算机程序,以确定性的方式运行在以太坊的虚拟机上,也就是我们常说的以太坊去中心化世界计算机。

拆解这个定义:

第一、计算机程序

简单的说,智能合约就是计算机程序,在这个上下文中,合约这个词并没有任何法律上相关的含义

第二、不可改变

一旦部署之后,智能合约的代码就不可更改。不同于传统的软件,更改智能合约的唯一办法就是部署一个新的实例

第三、确定性的

对于触发智能合约执行的交易上下文,或执行时的以太坊区块链状态,智能合约执行结果的输出对于每一个运行或调用它的人来说都是一样的。

第四、以太坊虚拟机上下文

智能合约运行在一个非常有限的执行环境中,它们可以访问自己的状态,调用合约交易的上下文信息,以及有关最近区块的信息

第五、去中心化的世界计算机

EVM作为每一个以太坊节点的本地实例运行,但是因为所有EVM都是运行在相同的初始状态,并且会输出完全相同的最终状态,所以整个系统就是一台世界计算机。

 

二、智能合约的生命周期

(1)关于合约实例地址

智能合约通常采用高级编程语言编写。但是为了在以太坊虚拟机上运行,这些代码必须编译为EVM可以执行的底层字节码。编译完成后,这些代码会通过一个特殊的合约创建交易部署到区块链上,这个特殊交易的目标地址是被称为0x0的合约创建地址。

每一个合约实例都通过以太坊地址来表示,这个地址由合约的创建交易在创建账户和随机数时生成。合约实例地址可以在交易中用作收款地址,向合约地址发送以太币,或者通过地址调用合约实例中的函数。请注意,不同于外部账户,对于新建的智能合约实例,并没有与之关联的私钥。作为合约创建者,也可不会收到一个合约账户的私钥,因为它并不存在,我们可以认为,智能合约就是自己的主人。

(2)关于合约调用

需要注意,合约只有在被交易调用时才会执行。以太坊上所有合约的执行,归根结底,都是由来自外部账户所创建的交易所触发的。一个合约可以调用另一个合约,然后一层层的在合约之间不断调用,但是这个执行链条中的第一个合约的执行,一定是外部账户所创建的交易触发的。

智能合约永远不会“自动运行”,或者“在后台运行”。在没有交易触发执行的情况下,合约永远处在等待调用的状态。另外还需要注意的是,任何情况下智能合约的“并发执行”都是没有意义的:以太坊世界计算机可以被认为是一台单线程的计算机。

(3)合约实例的删除

合约实例的代码是不能被更改的。然而,合约实例可以被删除,从它的地址把代码和合约实例的内部状态(存储)清空,让这个地址变成一个空账户。合约实例被清空后,任何向这个地址发起的交易都不会引发任何代码的执行,因为这个地址对应的合约实例已经没有代码可以执行了。

要删除合约实例,需要执行名为SELFDESTRUCT的EVM字节码。这个操作会产生负的gas消耗 ,也就是会提供gas退款,这也会激励人们通过删除存储状态的方式释放资源。

当然了,删除合约并不会清除这个合约之前交易的历史记录,因为区块链本身是不可变的。

 

三、关于以太坊高级编程语言

EVM是一个运行字节码这种特殊形式机器码的虚拟机,类似运行X86_64指令集的计算机CPU.

当然了,可以直接使用字节码开发智能合约,但是EVM字节码对于程序员来说非常的难读和难懂。因此,大多数开发者使用高级编程语言编写智能合约,然后通过编译器转化为EVM字节码。

智能合约运行在一个高度隔离并且机器简单的执行环境(EVM)中,大多数常见的用户界面、操作系统接口和硬件接口在EVM环境中都不复存在,另外跟 EVM相关的一系列系统参数和函数也需要在编程语言中有所体现和支持。

总体而言呢,编程语言可分为两类:声明式的和指令式的,也对应成为函数式的和过程式的。在声明式的编程语言中,我们通过编写函数来表示程序的逻辑,但是不体现出程序的执行过程。声明式编程语言包括Haskell和SQl。指令式编程语言与之相反,是指程序员编写一组包含了逻辑和执行流程的指令。指令式编程语言包括C++和Java。有些编程语言是混合式的,包括Lisp、JavaScript和Python。

尽管指令式程序代码更容易编写和阅读,大多数程序员也都在使用但却很难编写那些按部就班执行的代码。程序的任何部分都有可能改变状态,这使得我们很难推断程序的执行,并为非预期的副作用和错误引入了许多机会。声明式程序也许更难编写,但避免了副作用,从而更容易理解(和控制)程序的行为方式——程序的每个部分都是相互独立的,降低了理解程序的难度。

四、以太坊合约的应用程序二进制接口

在计算机软件中,应用程序二进制接口(Application Binary Interface,ABI),是指两个程序模块之间的接口,通常一个在操作系统层面,一个在用户程序层面。ABI定义了数据结构和函数如何在机器指令中被访问。需要注意,这并不是我们常说的API, API 定义了高级的、供程序员阅读和使用的源代码接口。ABI 是向机器指令层面编码和解码并传送数据的主要方式。

在以太坊中,ABI 用来编码合约中对EVM的调用和从交易中获取数据的调用。ABI的目的是定义合约中哪一个函数可以被调用,并且描述这个函数接收的参数和返回的数据。合约ABI 使用JSON格式表示

 

posted on 2020-04-22 17:45  ccbupt  阅读(804)  评论(0编辑  收藏  举报

导航