Skip to content

Latest commit

 

History

History
61 lines (36 loc) · 8.12 KB

File metadata and controls

61 lines (36 loc) · 8.12 KB

智能合约

社区公认的区块链1.0是以比特币为代表的虚拟货币的时代,代表了虚拟货币的应用,包括其支付,流通等虚拟货币的职能。具备的是去中心化的数字货币交易支付功能,目标是实现货币的去中心化与支付手段。区块链2.0则是以智能合约与货币相结合,对金融领域提供了更加广泛的应用场景。可见智能合约的出现对区块链平台发展的重要意义。

智能合约(Smart contract)的概念最开始并非针对区块链,而是在1994年由美国计算机科学家尼克·萨博提出,定义为“一套以数字形式定义的承诺,合约的参与方可以在上面执行这些承诺的协议“。其设计初衷是在无需第三方权威的情况下合约能以信息化方式传播、验证或执行。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。与传统合约相比,智能合约更加安全,并且大幅减少与合约相关的其他交易成本。受限于智能合约定义中的严苛条件,智能合约在提出后的很长一段时间并没有得到广泛的应用,直到比特币这种无需信任即可进行电子交易的加密货币系统的出现,人民发现其底层的区块链技术与智能合约的天然契合。区块链可借助智能合约的可编程性来控制分布式节点的复杂行为,智能合约则可在区块链去中心化的执行环境中得以实现。智能合约一旦部署其合约的代码就不能改变,与传统软件不同,修改智能合约的唯一方法是部署新实例。对于智能合约来说,它的的运行结果在每一个节点上都是一样的,分布在不同地理位置的节点从相同的初始状态下运行得到相同的最终状态,因此可以将其整体作为一个去中心化的世界计算机来看待。

智能合约的生命周期

智能合约通常以高级语言编写,例如Solidity。为了运行Solidity必须将它们编译为可以在以太坊虚拟机(Ethereum Virtual Machine)中运行的低级字节码。一旦编译完成,它们就可以通过创建智能合约的交易被部署到以太坊区块链中。每个合约都由以太坊地址作为标识,地址可以在交易中用作接收者,可将资金发送到合约或调用合约的某个功能。

重要的是,如果合约只有被交易调用时才会运行。以太坊的所有智能合约均由EOA账户发起的交易执行。合约可以调用另一个合约,其中又可以调用另一个合约,等等。但是这种执行链中的第一个合约必须始终由EOA的交易调用。合约永远不会“自行”运行,或“在后台运行”。在交易触发执行,直接或间接地作为合约调用链的一部分之前,合约在区块链上实际上是“休眠”的。

交易是原子性(atomic)的,无论他们调用多少合约或这些合约在被调用时执行的是什么。交易完全执行,仅在交易成功终止时记录全局状态(合约,帐户等)的任何更改。成功终止意味着程序执行时没有错误并且达到执行结束。如果交易由于错误而失败,则其所有效果(状态变化)都会“回滚”,就好像交易从未运行一样。失败的交易仍存储在区块链中,并从原始账户扣除gas成本,但对合约或账户状态没有其他影响。

合约的代码不能更改。然而合约可以被“删除”,从区块链上删除代码和它的内部状态(变量)。要删除合约,你需要执行称为SELFDESTRUCT(以前称为 SUICIDE )的EVM操作码,该操作码将区块链中的合约移除。该操作花费“负的gas”,目的是为了激励用户从以太坊上删除无用的合约以此来节省区块链平台的存储消耗。以这种方式删除合约不会删除合约的交易历史(过去),因为区块链本身是不可变的。但它确实会从所有未来的区块中移除合约状态。

以太坊高级语言简介

Solidity是一种静态类型的编程语言,用于开发在EVM上运行的智能合约。 Solidity被编译为可在EVM上运行的字节码。借由Solidity,开发人员能够编写出可自主运行其商业逻辑的应用程序,该程序可被视为一份具权威性且永不可悔改的交易合约。对已具备程序编辑能力的人而言,编写Solidity的难易度就如同编写一般的编程语言。

Gavin Wood最初在规划Solidity语言时引用了ECMAScript的语法概念,使其对现有的Web开发者更容易入门;与ECMAScript不同的地方在于Solidity具有静态类型和可变返回类型。而与当前其他EVM目标语言(如Serpent和Mutan)相比,其重要的差异在于Solidity具有一组复杂的成员变量使得合约可支持任意层次结构的映射和结构。Solidity也支持继承,包含C3线性化多重继承。 另外还引入了一个应用程序二进制接口(ABI),该接口(ABI)可在单一合同中实现多种类型安全的功能。

Remix是一个开源的用于Solidity智能合约开发的Web端IDE,提供基本的编译、部署至本地或测试网络、执行合约等功能。Solidity是Ethereum官方设计和支持的程序语言,专门用于编写智能合约,本书中的所有例子都已经在Remix测试通过。

Remix既可以本地部署,也可以直接使用官方部署好的环境,地址是:https://remix.ethereum.org.

Remix开发环境

不需要安装,直接在任何浏览器开启 Remix。

Remix 是一个 Open Source 的 Solidity 智能合约开发环境,提供基本的编译、部署至本地或测试网络、执行合约等功能。Solidity 是 Ethereum 官方设计和支持的程序语言,专门用于编写智能合约。

打开remix就可以看到欢迎页面,其中包括教程,环境选择,插件选择等。remix的所有功能都以插件的形式提供,刚打开网站并没有激活任何插件,只提供了最简单的文本编辑器的功能。为了基于这个环境编写调试solidity智能合约,首先就需要激活编译,部署调用Solidity合约的插件。

等激活这两个插件以后,可以在最左侧看到多了两个小图标,进入对应的页面,就可以编译,部署,调用Solidity的智能合约了。remix自带了一个Solidity编写的投票合约的例子,对于初学者来说这个合约太过复杂了,不如先从Hello word开始熟悉一下remix的基本用法。

先编写一个简单的solidity智能合约,合约的功能非常简单,就是打印Hello Solidity

pragma solidity ^0.5.0;

contract Hello {
    function sayHello() public pure returns(string memory) {
        return "Hello Solidity";
    }
}

至于合约中的细节先不深究,在后面的章节会一一说明,将合约输入到remix中。

编写好合约以后需要先在本地编译合约。

编译好合约之后,就需要部署合约和调用合约,当然这时的合约并不是真正部署在区块链上的,这个部署只是用本地的js虚拟的,毕竟区块链的特点之一就是不可篡改,如果编写的合约不经调试直接部署在区块链上就不能修改了,如果合约出现漏洞也很难补救,尤其是涉及数字资产的合约需要慎之又慎。

点击部署之后,就可以调用智能合约了,我们编写的智能合约只有一个方法,就是sayHello,调用这个方法后会返回字符串Hello Solidity。至此一个简单的智能合约就编写完成了,当然remix还有很多调试合约的插件没有用到,还需要读者自己去探索。