理解智能合约

这是「区块链技术指北」的第 22 篇文章。

如果对我感兴趣,想和我交流,我的微信号:Wentasy,加我时简单介绍下自己,并注明来自「区块链技术指北」。同时我会把你拉入微信群「区块链技术指北」。BTW,李笑来老师也加入了我的知识星球,文末有加入方式。

0x00 前言


理解智能合约对理解区块链技术至关重要。我们先来看下什么是智能合约。

智能合约是 1990s 年代由尼克萨博提出的理念,几乎与互联网同龄。由于缺少可信的执行环境,智能合约并没有被应用到实际产业中,自比特币诞生后,人们认识到比特币的底层技术区块链天生可以为智能合约提供可信的执行环境,以太坊首先看到了区块链和智能合约的契合,发布了白皮书《以太坊:下一代智能合约和去中心话应用平台》,并一直致力于将以太坊打造成最佳智能合约平台,所以比特币引领区块链,以太坊复活智能合约。[1]

也就是说,智能合约概念并不是随着区块链技术诞生的。区块链技术天然给智能合约带来得天独厚的应用前提。如果说区块链落地应用,比特币和以太坊就是最大的应用了。

了解什么是智能合约概念,我们接下来看下怎么样去理解它。

0x01 智能合约


智能合约程序不只是一个可以自动执行的计算机程序:它自己就是一个系统参与者。它对接收到的信息进行回应,它可以接收和储存价值,也可以向外发送信息和价值。

这个程序就像一个可以被信任的人,可以临时保管资产,总是按照事先的规则执行操作。

下面这个示意图就是一个智能合约模型:一段代码(智能合约),被部署在分享的、复制的账本上,它可以维持自己的状态,控制自己的资产和对接收到的外界信息或者资产进行回应。

智能合约模型:它是运行在可复制、共享的账本上的计算机程序,可以处理信息,接收、储存和发送价值。

简单地说,智能合约就是传统合约的数字化版本。它们是在区块链数据库上运行的计算机程序,可以在满足其源代码中写入的条件时自行执行。智能合约一旦编写好就可以被用户信赖,合约条款不能被改变,因此合约是不可更改的。

现实世界是怎么样应用智能合约的呢?开发人员会为智能合约撰写代码。智能合约可用于交易和(或)两方/多方之间的任何交换行为。该代码包含一些会触发合约自动执行的条件。一旦编码完成,智能合约就会被上传到区块链网络上,即它们被发送到所有连接到网络的设备上。一旦将数据上传到所有设备上,用户就可以与执行程序代码的结果达成协议。然后更新数据库以记录合约的执行情况,并监督合约的条款以检查合规性。[2]

0x02 Solidity


Solidity 是一种语法类似 JavaScript 的智能合约高级语言,它被设计成以编译的方式生成 以太坊虚拟机(Ethereum Virtual Machine,EVM) 代码。

它的语法接近于 Javascript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心合约,它又有很多的不同,下面列举一些:

  • 以太坊底层是基于帐户,而非 UTXO 的,所以有一个特殊的Address的类型。用于定位用户,定位合约,定位合约的代码(合约本身也是一个帐户)。
  • 由于语言内嵌框架是支持支付的,所以提供了一些关键字,如payable,可以在语言层面直接支持支付。
  • 存储是使用网络上的区块链,数据的每一个状态都可以永久存储,所以需要确定变量使用内存,还是区块链。
  • 运行环境是在去中心化的网络上,会比较强调合约或函数执行的调用的方式。因为原来一个简单的函数调用变为了一个网络上的节点中的代码执行。
  • 最后一个非常大的不同则是它的异常机制,一旦出现异常,所有的执行都将会被回撤,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致。[3]

0x03 DAPP


去中心化应用(DAPP)是可以使用户和供应商之间直接互动的服务。以太坊去中心化应用典型地通过 HTML/Javascript 网络应用与用户互动,使用 Javascript API 与区块链通信。去中心化应用典型地在区块链上有自己的相关合约套件,用来编码商业逻辑,允许持久存储对共识要求严格的状态。

DAPP 和 APP 是对应的。APP 我们已经很熟悉了,目前我们主要在 iOS 和 Android 平台使用各种类型的 APP。通常一个 APP 从设计、开发、测试、上线等过程都是由一个中心化的组织完成的,APP 的应用也是基于 C/S 架构,其中的 S 表示 Server,也是中心化结构。而 DAPP 不完全是指它的开发是去中心化的,而是它的运行是去中心化的。

目前最为成功的 DAPP 是 CryptoKitties,也就是那个撸猫游戏。这个游戏上线一度造成以太坊网络严重堵塞。

根据 State of the DAPPS 网站统计,目前基于以太坊的 DAPP 有 977 个。感兴趣的读者不妨去搜索看看。

0x04 实践


如果要学习智能合约编程,以下事项需要读者注意:

  1. 学习智能合约之前,需要搞清楚区块链、比特币和以太坊的相关知识。
  2. 细读 ERC20 协议。
  3. 学习 JavaScript、Solidity 编程语言。
  4. 熟悉周边工具,如 Truffle、Remix、Metamask 等。
  5. 制定开发目标,实现一些小应用。
  6. 阅读知名基于 ERC20 区块链项目代码。

比如在第五步,你可以自行在以太坊测试网络或者正式网络发行 Token,还可以基于开源的 Pet Shop 实现第一个 DAPP。

0x05 相关资源


5.1 Terminal


  • Mist
  • MetaMask
  • MyEtherWallet

5.2 IDE


  • Remix-Solidity IDE

如果你使用 Sublime Text 进行 Solidity 编程,推荐使用以下插件:

  • Solium Gutter
  • Ethereum
  • EthereumSoliditySnippets

如果你使用 Atom 进行 Solidity 编程,推荐使用以下插件:

  • linter-solidity
  • autocomplete-solidity
  • linter-solium

5.3 Frameworks/Tools


  • JSON RPC API
  • Truffle development framework
  • Ethereum JavaScript API
  • Solidity GitHub
  • Open-zeppelin
  • truffle-artifactor

5.4 Docs


  • Ethereum 官网
  • Ethereum GitHub
  • Solidity 官方文档
  • embark’s documentation
  • 《SOLIDITY 智能合约编程指南》
  • 以太坊智能合约快速入门
  • The Ethereum Wiki
  • Dapp Developer Resources
  • EthFans 知识库
  • 如何编写智能合约
  • 汪晓明对区块链、以太坊的思考

5.5 Forum


  • web3-js 论坛
  • Ethereum for web developers
  • 以太坊中文技术社区
  • 台北以太坊社群專欄
  • 区块链技术中文社区
  • developerWorks 社区
  • Story Backlog)
  • Gitter Chat

0x06 小结


本文介绍了智能合约,智能合约程序不只是一个可以自动执行的计算机程序:它自己就是一个系统参与者。它对接收到的信息进行回应,它可以接收和储存价值,也可以向外发送信息和价值。接着讲解了智能合约使用的编程语言 Solidity,接着介绍了 DAPP,然后给出了学习智能编程的步骤,最后给出了相关的资源,希望可以帮到读者。

未来会有更多的 DAPP 进入我们的生活,如果读者是个开发者,不妨找个场景实现个 DAPP。

0x07 参考


  • [1] GitHub (2016-07-07). 智能合约. Retrieved from https://github.com/EthFans/wiki/wiki/智能合约.
  • [2] 知乎 (2017-07-05). 为什么要用区块链技术实现智能合约?. Retrieved from https://www.zhihu.com/question/43404157/answer/193952393.
  • [3] 简书 (2016-12-18). Solidity 语言介绍. Retrieved from https://www.jianshu.com/p/b9f78f9b4c3e.

原文发布于微信公众号 - 区块链技术指北(BlockchainAge)

原文发表时间:2018-01-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

了解智能合约

智能合约是由公共区块链所带来的新技术,因为其部分混淆了描述的核心互动,所以这个术语会让人很难理解。智能合约有助于实现分散的体系,它存在于所有被允许的各方之间,不...

38680
来自专栏区块链大本营

Google工程师:如何做到区块链的最小可行性呢?

41060
来自专栏CDA数据分析师

理解区块链和加密货币的终极指南

如果你对当下大热的区块链和加密货币还不太了解,不要担心,今天我们将解读这些信息!

13830
来自专栏陈树义

极简入门:什么是智能合约?

「智能合约」一词是由Nick Szabo在1997年首次提出的,比比特币的出现要早很多。他是位计算机科学家、法学学者,还是个密码译解专家,所以我还是替他跟你「讲...

8010
来自专栏极客编程

以太坊智能合约Demo

智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战demo示例快速入门,用demo例子深入浅出智能合约开发,体会以太坊构建去...

32120
来自专栏区块链深度

智能合约是怎样运作的?三分钟读懂智能合约

当今社会,执行合约需要耗费大量社会资源。比方说,A、B两家公司签订合同,后来A违反合同条约,导致B损失重大。B想要拿回属于自己的东西,于是向法院起诉。就算B打官...

21340
来自专栏Java架构师进阶

一个程序员眼中的区块链技术

我为什么要写这篇文章?在了解区块链相关信息时(例如维基百科上的内容),我发现这些内容非常零碎和不连贯。要把这些零碎的信息整合在一起,形成一个完整的视图需要花费大...

10740
来自专栏极客编程

智能合约用solidity编程语言开发一个以太坊应用区块链投票实例

智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战示例快速入门,用例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技...

15020
来自专栏liuchengxu

用表情符号解释比特币 - Part 1

比特币是一个存储和消费数字货币的革命性方式,并且有着变革其他领域的潜力。无须成为一个数学家或密码学家, 你就可以理解它是怎么回事。当开始看到整个系统是如何形成时...

8620
来自专栏区块链入门

【深度知识】以太坊第2层扩容方案:状态通道(State Channels)、Plasma 和 Truebit

对于以太坊来说 2018 年是着力基础建设的一年。今年是初期用户来测试网络极限的一年,并将重新关注一些扩展以太坊的技术。

26370

扫码关注云+社区

领取腾讯云代金券