大家一直对智能合约很好奇,都说智能合约很强大,到底强大在什么地方呢?其实,通过这次的整理,我也是对智能合约的概念以及运行原理有了更深一层的了解,而对于智能合约为何如此强大这一问题还是一知半解,如果有对智能合约比较通透的大佬,能够指点迷津的话,真是感激不尽呢~~
为了整理这些,我也是花尽了心思呀,如果有不妥之处,还望大家能够提出来,咱们一起讨论一下。
目录
一. 什么是智能合约?
“智能合约”这一术语是 1994 年由著名密码学家尼克·萨博首次提出的,它是通过编程来准确高效地执行预先设定的合约条款。
详细的解释就是:智能合约其实是一种计算机协议,用一段计算机指令实现自我验证、自动执行,并产生可以验证的证据来证明合约操作的有效性,不需要人为干预。
当智能合约的双方在区块链上产生资产交易的时候就会自动触发一段代码来自动完成具体的交易流程,这串计算机代码就是智能合约。
从本质上来说,智能合约是指运行在区块链上的一段条件语句代码,(通过编码的方式在区块链上创建了一份数字化的合约),当一个预先编好的条件被触发时,智能合约执行相应的合约条款。它可以处理信息、接收、储存和发送价值。
简单理解的话,你可以把自动售货机看成一个销售商品的智能合约,执行的就是你和机器主人之间关于如何购买一瓶饮料的合约
智能合约是以太坊网络上的一种特殊账户,我们有用户账户,还可以拥有智能合约账户。
用户账户:地址(有点像我们的银行帐号——比特币也有同样的概念)、余额(我有多少钱:以太)
智能合约账户:地址、余额(有多少钱:以太)、状态、代码
地址是帐户的唯一标识符,与常规用户帐户一样。
余额也与常规用户帐户相同。不同的是,智能合约的余额意味着代码可以拥有资金,它可以管理资金。因此如果代码不正确,它可能会错误处理这笔资金。
智能合约帐户的状态是智能合约中声明的所有变量和变量的当前状态。它的工作方式与大多数编程语言中的类中的变量变量相同。实际上,最简单方法去理解智能合约可以类比为一个类实例化对象,唯一的区别是这个对象永远存在区块链网络中(除非程序进行自毁)。
智能合约的代码是编译后可以在以太坊客户端和节点可以运行的字节码。它是在创建智能合约时执行的代码,它包含我们可以调用的函数。就像面向对象编程语言中的对象一样。
智能合约更有趣地方:他们可以调用其他智能合约,这开启了创造一个自主代理的能力,这些代理可以自己进行交易。
假设我们使用上面的代码创建一个智能合约。 代码有一个类型为 uint(无符号整数) 名为 “counter” 的变量。 counter 变量的内容(值)就是该合约的状态。 每当我们调用 count () 函数时,此智能合约的区块链状态将增加 1,这个状态是对任何人都可见的。
关于成本和执行:
可以想象,我们不能一直在区块链上免费运行计算量很大的程序。
代码的执行由调用者以称为 Gas 的方式支付费用。Gas 是运行以太坊虚拟机的燃料。我们可以将其视为每次执行指令的付款。在发起调用时,我们必须设置此调用上预计花费的最大 gas 消耗量(Gas Limit)。例如,如果我们调用的代码进入永久循环,执行花费不会超过我们设定的最大消耗量(Gas Limit)。
Gas 执行费用由网络的矿工(他们是运行代码的节点)决定。
二. 为什么要提出智能合约(基于区块链技术)?
(一)传统合约的缺点
传统合约:
签订合同:通过双方签订合同来约束彼此经济活动的经历。
缺点:无法保证双方都能在规定期限内完整的履行合同规定的内容。也会受到主客观、经济成本、使用范围、执行力度和执行时间等因素的影响。
(二)智能合约的优点
而智能合约:可以在很大程度上解决传统合约中这些因素的影响。
智能合约的主要特点(四个方面):概括为去中心化、智能高效(自动执行、无人为的干预)、准确、低成本。
针对四个特点的详细描述:
众所周知,区块链最大的特质就是去中心化,在不信任中创造出信任。基于区块链的智能合约是将合约以数字化的形式写入到区块链中,在区块链优秀特性的加持下自然的具备了去中心化的特点,合约内容公开透明、条理清晰且不可篡改,编程语言就是规束合约的法律条文,交易双方可完全放心的进行交易。
智能合约的整个产生和执行过程都是可追溯、不可篡改的。一旦触发合约就会立即执行,自动按照合约规范进行操作。整个过程智能高效,短时间快速完成更是体现了它的准确和经济。
智能合约的优点:(为什么要加入智能合约?)
①智能合约可以对于触发条件进行智能判断;
②智能合约中的惩罚等条件是提前进行明晰的;
③智能合约的成本要明显低于传统合约成本。因为智能合约中的各项执行条件等已经被提前写入代码,执行时候不需要再耗费更多的人力物力,即可进行。
④从惩戒的方式而言,智能合约中,各种数字资产被当做抵押品,若有违约行为发生,则违约者会有资产的损失,但传统合约中,则将通过法律手段进行制裁。
⑤适用的范围不同,智能合约可以在全球范围内进行推广并投入使用。
其他说法:
(1)具备实时更新的能力,且效率很高。在定义部分我们介绍了智能合约的执行不需要第三方的参与,它可以随时响应用户的请求,进而确保了交易的效率。
(2)可以十分准确的执行合约。因为智能合约在部署之前就已经制定好了所有的条款和执行过程,并在计算机的绝对控制下执行,因此整个过程不可能出现错误。此外,因为合约是在计算机的控制下执行,所以节省了大量的人工成本。
(3)合约内容不可篡改,减少人为干预。智能合约一旦部署,合约的所有内容都将无法修改,交易双方都不能干预合约的执行,倘若有一方毁约,便会受到相应的处罚,这种处罚也是在部署合约之前就制定好的。
(三)未解决传统计算机技术实现智能合约的“信任问题”
智能合约一定要在区块链技术之上实现吗?
答案是否定的。
举例说明如下:
自动售货机。当我们选择了需要的商品,投币支付时,如果金额大于等于商品的价格,售货机对应的商品就会掉下来,如果你的零钱大于商品的价格,它会找你零钱,如果金额不足,则交易无法完成,也就不能买到商品。
我们仔细对比一下,这个流程是符合智能合约定义的那些条件的,自动售货机就是一个简单的智能合约。
既然现在的互联网计算机技术就可以实现自动交易的合约,那为什么这种类型的智能合约应用没有广泛应用呢?那是因为信任问题还没有解决。
智能合约实际上是数字化的代码,那会不会有合约被篡改之类道德风险,抑或是被黑客攻击的技术风险呢?答案是存在的。而且在上面的两个例子中,我们之所以会使用这些服务,是因为有银行和政府作为背书,大家愿意信任它们,才会使用这些服务。但是同样的服务,如果搬到很小众的平台或者很难互相信任的个体或者机构之间,还会有人选择这种服务吗?我想很少甚至没有人愿意,就是因为不信任。
那为什么基于区块链的智能合约凭什么就可以得到大家的信任呢?我们经常都听到,区块链就是一个去中心化的分布式记账系统。还有一点,不可篡改性,这是因为传统的数据库是包含CRUD(增删改查)四种操作的,而在区块链的数据库中没有删除,你所有的记录都存在于区块中,这样就不用担心合约的内容被篡改;再者,可靠性,不用担心条件满足时不执行合约;其次,去中心化和分布式账本的全网备份,能够让你随时审查。去信任就是区块链技术带来的革命性变化。
三. 如何实现智能合约?
智能合约是如何运行的?
当智能合约部署到以太坊网络时,任何人都可以调用智能合约的功能。
工作原理:
构建智能合约:智能合约由区块链内的多个用户共同参与者制定,可用于任何用户之间的任何交易行为。协议当中明确规定了交易双方的权利和义务,开发人员将这些权利和义务以电子化的方式进行编程,代码中包含会触发合约自动执行的条件。
存储合约:一旦编码完成,这份智能合约便被上传到区块链网络上,即全网的各个节点都可以接收到这份合约。
执行合约:智能合约会定期检查是否存在相关事件和触发条件,将满足条件的事件推送到待验证的队列中,区块链上的验证节点先对事件进行签名认证,以确保其有效性,等大多数验证节点对该事件达成共识,智能合约将成功执行,并通知用户。
在整理的过程中,我们从网上已经发表的一篇题为“智能合约—架构与进展”的论文中看到的一幅图,我觉得这幅图很深刻,看着这张图,整个人的思维都清晰了不少,有兴趣的朋友,可以从网上下载这篇论文,仔细的研读一下,或许收获更多。
智能合约的运行机制如上图, 智能合约合约一般具有值和状态两个属性,代码中用If-Then和What-If 语句预置了合约条款的相应触发场景和响应规则,智能合约经多方共同协定、各自签署后随用户发起的交易提交,经P2P网络传播、矿工验证后存查在区块链特定区块中,用户得到返回的合约地址及合约接口等信息后即可通过发起交易来调用合约。矿工受系统预设的激励机制激励,将贡献自身算力来验证交易,矿工收到合约创建或调用交易后在本地沙箱执行环境(如以太坊虚拟机)中创建合约或执行合约代码,合约代码根据可信外部数据源(也称为语言机,Oracle)和世界状态的检查信息自动判断当前所处场景是否满足合约触发条件以严格执行响应规则并更新世界状态。交易验证有效后被打包进新的数据区块,新区块经共识算法认证后链接到区块链主链,所有更新有效。
智能合约与DApp:
以太坊社区把基于智能合约的应用称为去中心化的应用程序(Decentralized App)。
DApp的目标是(或者应该是)让你的智能合约有一个友好的界面,外加一些额外的东西,例如:IPFS(可以存储和读取数据的去中心化网络,不是出自以太坊团队但有类似的精神)。DApp可以跑在一台能与以太坊节点交互的中心化服务器上,也可以跑在任意一个以太坊平等节点上。(思考:与一般的网站不同,DApp不能跑在普通的服务器上。他们需要提交交易到区块链并且从区块链而不是中心化数据库读取重要数据。相对于典型的用户登录系统,用户有可能被表示成一个钱包地址而其它用户数据保存在本地。许多事情都会与目前的web应用有不同架构。)
DApp流程:
①用Solidity(或其他语言)编写智能合约(后缀为.sol)
②用solc编译器将.sol合约编译成EVM字节码
③编译好的字节码回送给dapp前端
④前端将编译好的智能合约部署到区块链中
⑤区块链返回智能合约地址+ABI(合约接口的二进制表示。合约接口用JSON表示,包括变量,事件和可以调用的方法)
⑥前端通过Address+ABI+nonce,调用智能合约。智能合约开始处理。
四. 智能合约的应用场景?
尼克·萨博是根据自动无人售货机提出的智能合约,所以从某种意义上可以说自动售货机是智能合约的第一次大规模应用。
其他应用场景:(智能合约的48个应用场景介绍:http://www.elecfans.com/blockchain/1058844.html)
①用于解决金融借贷领域的P2P网络金融雷潮事件;
②用于社会保障领域养老保险、医疗保险,借助智能合约技术,没有第三方的参与避免了贪污腐败问题的发生;
③用于物联网环境下供应链查询和物品真伪查询;
④用于房屋租赁、身份认证、知识产权保护、博彩发行、市场预测等。
五. 在geth控制台上部署和调用智能合约(具体可参考:https://blog.csdn.net/zqq_2016/article/details/103050801)
以太坊中矿工的职责:
①诚实矿工:接收、验证、传播区块和执行交易(主要是调用合约交易)。
②理性矿工:可能只是产生区块。
六. 基于Remix+MetaMask部署合约(参考链接:https://blog.csdn.net/zqq_2016/article/details/103435025)
参考链接:
https://www.jianshu.com/p/4ee4a0c73402
https://www.jianshu.com/p/18f822e7ff6b
已发表论文(题目):智能合约—架构与进展