从区块链2.0开始,区块链就不再局限于货币类应用,而可以支持各种各样的程序应用。这些在区块链上运行的程序应用就被称为:智能合约。那么这个智能合约是如何产生?如何才能运行呢?
什么是智能合约?
“智能合约”的最早提出者是一个叫尼克·萨博的计算机和法律的双料专家,看过树哥相关文章的人都知道,他也来源于一个神秘的密码学组织“密码朋克”。尼克·萨博因为智能合约的概念提出而广为人知,不过,很多人不知道的是,他曾今在世界上第一个中心化的加密货币体系E-cash的母公司DigiCash工作过,并且他还提出了一套叫做“比特金”的加密货币体系,是比特币的基础。
尼克·萨博定义的智能合约是一段可以解决法律执行问题的计算机代码,而当前我们所说的智能合约往往指的是在区块链网络上运行的一段代码。
智能合约与普通程序应用有什么区别?
我们常用的软件都是中心化的软件,我们可以简单把这个软件划分为软件后端和软件前端。简单来说,软件后端就是在中心化服务器上的后端软件,例如运行在腾讯服务器上的微信后端程序;而软件前端也就是安装在我们手机上的前端应用,也就是我们使用的微信程序。一般来讲,绝大多数的数据、重要的权限都是在服务器的后端存储和决策,而前端多用于展示信息和搭建用户与后端操作的一个窗口。
一个区块链的应用往往被称作为“DAPP”,也就是去中心化的应用。它也分为前端和后端。如下:
- 前端:用户交互的界面。
- 后端:智能合约。部署在区块链上的代码。*
通过这里我们可以看到,作为一个区块链应用dapp来讲,前端和传统的前端并没有什么不同。
真正的区别在于后端,dapp的应用的后端就是智能合约,是部署的到区块链上的代码。
有可能你会问:你说的是DAPP和普通的程序应用有什么区别,而不是智能合约和普通的程序应用有什么区别。
你说的对。智能合约虽然只是DAPP的一部分,但它和传统的应用后端应用还不同。
- 智能合约可以不需要前端,可以独立在区块链上发挥作用。
- 一般来讲,智能合约都是明文存储在区块链上,也就是说,任何人都可以看到这个智能合约源代码,了解这个智能合约。
- 任何知道智能合约ID编号的人,都可以调用智能合约,而不是只有智能合约发布者能调用。
而这一切区别的根本原因是底层的机制不同,传统的中心化服务器的服务端只在服务器上保存,而区块链的智能合约需要保存在成千上万台电脑上。具体的细致分析请看树哥的其他相关文章。
智能合约的诞生
树哥这里提到的智能合约的诞生,并不是智能合约的代码编写完成,而是指智能合约诞生在区块链之上。 换句话来讲,智能合约的代码写完只是女娲娘娘捏好的泥人,只有把它放在区块链之上它才能具备生命力。
智能合约的编写没有太多可以说的问题,不同的区块链支持不同的编程语言,本质上说,这是由区块链上的虚拟机所决定。虚拟机是各个区块链系统虚拟出的计算机系统,目的上把千差万别的计算机硬件、操作系统都屏蔽掉,留下一个隔绝外界环境的沙箱,专门供区块链智能合约的执行。这个虚拟机支持哪些程序语言,就代表着它能识别哪些程序语言,并把这些程序语言编译成计算机可以执行的机器代码。以太坊的智能合约语言是solidity,go等等编程语言,维基链的智能合约语言是lua。 这些编程语言的共同特点就是短小、精悍,可以实现的功能并不强大。
智能合约诞生的最重要的过程就是智能合约上链。
智能合约上链需要几个条件:
- 智能合约通过虚拟机编译审查。不管这个智能合约编写逻辑多么错误,代码写得多么不好,都可以上区块链,但必须是符合要求的语言编程规范。简单类比,不管你试卷打多少分,但首先是使用中文在答题。
- 必须通过一个全节点来部署,这一点极其重要。当然这个全节点可以自己搭建,或者利用已有的全节点。有一些全节点提供钱包的功能,使用这个全节点上的钱包,就相当于使用了这个全节点。简单类比,你要在某个团体内发表一个声明,你就必须成为团体一员,或者需要借助其中的一个成员才行。
- 发布智能合约必须要付出一定的代价。这个代价就是矿工费用,只有支付一定的矿工费用才能被矿工接受,矿工把它打包之后才能放到区块链之上。既然需要支付矿工费用,这就意味着发送智能合约的人有自己的账户,而从账户支付金钱则需要采取自己的私钥签名。如果是一个全节点,使用私钥签名来发布合约的过程,由全节点来执行。如果是一个钱包的话,则由钱包进行私钥签名转账,发布合约则使用钱包所附属的全节点来执行。
所以综合以上,智能合约的诞生过程如下:
1.通过虚拟机认可的编程语言进行编程。
2.通过私钥签名,由全节点将编写的智能合约发布出去。
3.相关的矿工将这个智能合约进行打包,并把它写入到区块链之中。
智能合约的调用和执行
事实上,智能合约发布到区块链之上,它是不会自动执行的。如果想让智能合约执行,就需要有相应的触发条件。例如外部程序调取智能合约,智能合约判断时间条件进行执行。
树哥以外部调取智能合约为例,说一下智能合约的执行过程。
智能合约并不是像中心化服务器那样时时刻刻都在执行中,而是只是处于区块链上的某个区块之中。它们静静地待在那里,丝毫不动,也不会自动执行。
当某个外部程序需要调用这个智能合约的时候,就指定这个智能合约的注册ID及需要传入的参数,就可以调取这个智能合约,当然调用这个智能合约也需要支付足够的矿工费用才行。智能合约被调取,利用传入的参数信息,执行相应的程序,把智能合约执行完成后,把该写入区块链的写入区块链,这样的智能合约执行过程就算结束了。在这里需要说明的是,写入到区块链的数据库中,也算是写入到区块链之中。
我们以树哥最近写的一个区块链打卡程序简单说下过程:这个智能合约不判断调用人的身份,只要转移一定代币单位,并符合要求就可以调用这个打卡智能合约进行打卡。当前端调用智能合约打卡后,智能合约通过转入代币的地址,就把之前保存在区块链数据库中的关于此人的参数就全部读取出来,他的key就是转账的地址,value就是相关的参数。然后进行一个轮次的打卡,判断是否符合平分奖金池的条件,当满足条件后,就可以把奖金池中的代币按照比例返回给这个调用打卡智能合约的地址。也就是任何人都可以通过前端程序,甚至是自己写的程序来调取这个智能合约代码,智能合约代码都按照事先写好的内容进行执行,执行完成后就把相关的信息打包,按照key、value的方式在链上进行存储。
总结:智能合约的诞生和运行过程和传统程序运行过程有所区别,甚至包含与智能合约进行互动,读取或者写入参数也都要麻烦得多,这是因为智能合约不仅仅是中心化服务器一台电脑的程序,而是千千万万区块链虚拟机上的需要同时执行的程序,并且需要按照区块的出块节奏来执行程序写入数据上区块链之中。这也是区块链智能合约受限的一个原因吧。
作者介绍:树哥,树哥区块链创始人、立志用最通俗的语言让小白透彻了解区块链技术。著作:《区块链从小白到精通》,创建区块链从小白到精通体系,开发:新生大学《树哥解读以太坊》、千聊《树哥教你智能合约开发》等课程。公众号\头条号\新浪博客\百度百家:树哥区块链。
网友评论