你可能听说过「智能合约」,甚至可能知道它们是在区块链上运行的代码。但是你如何才能在区块链上运行代码?这不是可以轻易理解的简单概念。本文解释了智能合约是如何在以太坊区块链上运行的。对编程的基础理解将会有所帮助,因为本文包含了一些用于举例的简单代码。为了清晰起见,本文将其中的一些技术细节稍微进行了简化,但概念是有效的。

原文标题:《Understanding Ethereum Smart Contracts》
原文作者:Gjermund Bjaanes
翻译:蓝狐笔记社群 Dyna

一、区块链 —— 快速入门

这里不讲太多细节,区块链技术的核心概念是分布式账本。它是一种在众多参与者之间共享的特殊类型的数据库。

这个特殊的数据库就是一个交易列表,记录了网络中发生的每一笔交易。每个人都有一个副本。这种去中心化分布结合强有力的货币激励措施 , 消除了各方之间信任的必要性。

传统意义上,当事人之间的信任是通过中间人,即第三方来解决的,比如 Paypal、银行。与你不信任的人之间的交易将通过双方都信任的中间人进行。

有了区块链,这种需求消失了。因为你可以把你的信任放在网络上,在这里,强有力的激励措施消除了作弊欺骗的欲望 (简而言之:遵守规则更有利可图)。

深入交易细节,理解以太坊智能合约的工作原理

更具体地说:区块链网络是一组机器,它们记录着相同的交易列表副本 (例如,从 A 转给 B 的钱)。

因为每个人都有相同的列表,所以很难欺骗网络接受错误的交易。结合一些加密算法和货币奖励以便遵守规则,你的网络会非常安全。

所有这些也使得区块链几乎是不可变的,因为改变历史记录的唯一方法是获得全网大多数人的同意。

二、什么是智能合约?

区别于比特币,以太坊最大的不同是引入了智能合约的概念。比特币是数字货币,以太坊也是数字货币,但远不止这些。

「智能合约」这个名称有点误导人。它们不是真正的合约,也不特别智能。它们只是一些可以运行在区块链上的代码 - 或者说是计算机逻辑运算。

首先,我将介绍有关智能合约是以太坊网络上的一种特殊账户。你有用户账户,你还有智能合约账户。

一个用户账户包括:

  • 一个地址(类似于你的银行账号-它也存在于比特币上)
  • 余额(我有多少钱)

一个智能合约账户包括:

  • 一个地址
  • 余额(以太坊)
  • 一个状态
  • 代码

地址和普通账户的地址是一样的,它是该账户的唯一识别符。

余额和普通账户也是一样的概念。唯一令人激动的是,智能合约上的余额意味着代码可以拥有金钱。它可以处理这些钱,也可能因为编码错误而造成处理不当。

智能合约帐户的状态是智能合约中声明的所有字段和变量的当前状态。它的工作方式与大多数编程语言中类的字段变量相同。事实上,一个类的实体化对象可能是理解智能合约的最简单方法。唯一的区别是这个对象是永久存在的 (除非被编程为自我毁灭)。

智能合约的代码是编译好的字节代码,以太坊客户机和节点可以在上面运行。它是在创建智能合约时执行的代码,并且包含可以调用的函数。就像面向对象编程的语言中的任何对象一样。

关于智能合约的趣事:它们可以调用其它的智能合约。这就开启了创建自主代理的能力,这些代理可以自己花钱和进行交易

深入交易细节,理解以太坊智能合约的工作原理

假设我用上面的代码创建了一个智能合约。该代码有一个名为 counter 的字段,类型为 uint(整数)。counter 变量的内容是本合约的状态。每当我调用 count() 函数时,任何人都能看到这个智能合约在区块链上的状态将会加 1。

深入交易细节,理解以太坊智能合约的工作原理

稍后我们将通过更多的例子来解释它是如何工作的,但首先我想回到以太坊和比特币的交易,并以此来解释一些事情。

三、交易水平上,以太坊 VS 比特币

比特币交易非常简单。你可以只做一件事。一种类型的交易。略过一些细节,一切都可以归结为TO (付给,谁在收钱),FROM (来自于,谁在付钱)和 AMOUNT(数量,多少钱)。这使得比特币成为一种价值储存手段,能够在网络参与者之间传递价值。

以太坊的不同之处在于交易还有一个「DATA」(数据)字段。该「DATA」字段支持三种类型的交易:

价值转移(和比特币一样)

  • TO接收地址;
  • DATA字段为空或包含要附加的任何消息;
  • FROM
  • AMOUNT 是你要发送的以太坊数量

创建智能合约

  • TO 字段为空(它触发智能合约的创建)
  • DATA 字段包含编译为字节代码的智能合约代码
  • FROM 你
  • AMOUNT 可以是 0 或者任意你想放在合约里的以太坊数量

调用智能合约

  • TO 字段是智能合约账户地址
  • DATA 字段包含函数名称和参数 —— 如何调用智能合约
  • FROM 你
  • AMOUNT 可以是 0 或者任何数量的以太坊,比如你需要为一项服务合约支付的数目

在这些交易中还有更多的字段和复杂性,但以上这些已经很好地解释了核心概念。让我们看看关于这些交易的一些更具体的例子。

价值转移

深入交易细节,理解以太坊智能合约的工作原理

非常简单。TO向一个地址发送一定数目的以太坊代币。你也可以为一笔交易加上一条消息。

创建智能合约

深入交易细节,理解以太坊智能合约的工作原理

正如以上提到的,一个空的 TO 字段表示创建一份智能合约。DATA 字段包含编译为字节代码的智能合约。

调用合约

深入交易细节,理解以太坊智能合约的工作原理

我们稍后会回到这个问题,但是其主要概念是你将交易发送到你想要调用的智能合约地址,然后将函数调用放在 DATA 字段中。

四、注意成本和执行

正如你所想象的,你不能一直在区块链上免费运行计算量很大的程序。

代码的执行是由调用者用一种叫做 gas 的东西来支付的。Gas 是运行以太坊虚拟机的燃料。你可以将其视为每次执行指令的费用 (就像一行代码)。

你需要为一个特定的合约调用设置可花费的最大 gas。比如,如果你调用的代码进入了一个永久循环,将会确保在执行过程中所花费的 gas 不会超过设置的最大 gas。

gas(执行) 的成本由网络的矿工 (运行代码的节点) 决定。关于 gas 和执行,还有很多知识。但以上这些值得牢牢记住。

五、智能合约如何工作?

当一个智能合约被部署到以太坊网络时,任何人都可以调用智能合约的函数。虽然出于安全考虑该函数可能阻止人们调用,但你可以自由尝试。

假设有一个 MyObject 类型的对象。该对象有一个名为 myFunction 的函数。要调用它,只需引用对象的实例、调用哪个函数和使用哪个参数调用。

像这样:

myObjectReference.myFunction(parameters);

该函数返回的任意值,可以将其存在变量中:

myVariable = myObject.myFunction (parameters)

调用一个智能合约在概念上是一样的。唯一的区别是,你必须将调用相关的所有信息放在交易中,对其签名并发送到网络上来执行。

假设你想要调用函数 myFunction,其中包含智能合约「0x0123456」里的一些参数。调用智能合约分四步:

深入交易细节,理解以太坊智能合约的工作原理

现在,当交易被放进区块链中的一个块,该状态变化便会被记录在整个网络中。

六、世界计算机

许多人把以太坊称为世界计算机。这是个不错的类比。它就像一台由整个世界来维护的虚拟机。

但是请记住:虽然智能合约是图灵完备的,并且理论上可以做任何事情,但它们不太适合繁重的计算工作。

以太坊世界计算机就像一台运行简单程序的老式慢速计算机。由于成本和安全性,保持以太坊的智能合约小而简单是至关重要的。

合约需要的计算量越多,运行的成本就越大。合约越复杂,就越有可能存在安全漏洞。而且智能合约中的安全漏洞是很难处理的——毕竟区块链是不可变的。

深入交易细节,理解以太坊智能合约的工作原理

举例:通证

回归重点,我想解释一下通证是如何工作的。

大多数这些通证都是在以太坊上创建的,而且概念非常简单(它运行良好,但是太简单了,以至于几乎可以说是愚蠢的)。

如何使用 Javascript 或其他编程语言编写一个简单的货币系统 ? 你可以在一个文件中完成所有的操作。你真正需要记录的是:

  1. 总供应量
  2. 账户
  3. 账户中的余额
  4. 资金流向

通过用户和余额之间的简单映射,你可以得到 123 的答案:

深入交易细节,理解以太坊智能合约的工作原理

该 map 只是把一个账户映射到一笔钱。

使用构造函数(constructor),你可以在自己的帐户中设置初始供应量 (或分布在任意数量的账户中)

深入交易细节,理解以太坊智能合约的工作原理

资金的流动是通过简单的函数来完成的,即从一个账户中减去,然后加在另一个账户上。

深入交易细节,理解以太坊智能合约的工作原理

创建通证与我们在以太坊使用的概念完全相同。当然,还有一些更复杂和额外的功能,但是基本概念非常简单。

以下就是基本的通证合约在以太坊编程语言中呈现的样子 (再次重申:为清晰起见进行了简化):

深入交易细节,理解以太坊智能合约的工作原理

这就是基础编程概念。我认为这说明了以太坊作为一个平台的力量。通过一些简单的代码,你可以凭空生成一个代币,它本质上就是由世界计算机记录的一些变量。欢迎来到新的互联网。

来源链接:www.gjermundbjaanes.com