首页
下载应用
提交文章
关于我们
🔥 热搜 🔥
1
1
2
1'"
3
bxss.me
4
@诉说趣闻
5
1'
6
@纽约时间
7
search
8
\\bxss.me
9
//bxss.me
10
c:/windows/win.ini
分类
社会
娱乐
国际
人权
科技
经济
其它
首页
下载应用
提交文章
关于我们
🔥
热搜
🔥
1
1
2
1'"
3
bxss.me
4
@诉说趣闻
5
1'
6
@纽约时间
7
search
8
\\bxss.me
9
//bxss.me
10
c:/windows/win.ini
分类
社会
娱乐
国际
人权
科技
经济
其它
二湘:朱令去世一周年,清华学子控诉清华在朱令案中的冷血和无耻
“四川大学姜涛与爱人程月玲”,你们现在还好吗?
半年狂赚63亿了,微众银行董事长,还要卷员工
为了这部描述从“反右”到“文革”的禁片,田壮壮付出了十年不能拍片的代价
行游天地 阅启新章|Bloomberg Pursuits
生成图片,分享到微信朋友圈
查看原文
其他
详解以太坊:关于智能合约
Original
岳小鱼
岳小鱼
2023-04-05
Web3世界依旧处于早期阶段,因此在研究这个领域时,不可避免地要了解很多关于技术层面的东西。
对于没有技术基础的行业新人来说,去理解底层技术会非常困难,然而收益却没有那么大。
就像当我们去研究黄金时,我们不需要去钻研黄金的化学分子构成,而是会研究黄金的基本属性、市场价值、流通体系等等。
因此,本系列文章将从一个产品经理的视角出发,输出“用户体验友好”的内容,尽量不去深究技术细节,而是从整体架构、运作机制等方面剖析以太坊。
本文是《详解以太坊》系列文章的第4篇,之前的文章请参见:
详解以太坊:整体框架
详解以太坊:关于交易机制
详解以太坊:关于共识机制
以太坊开启了智能合约公链时代,智能合约是以太坊最重要的创造,也是以太坊之所以可以成为“全球计算平台”的核心所在。
只有理解了智能合约,才能算是真正理解以太坊。
01 什么是智能合约?
我们生活中其实有各种“合约”,比如买车、买房、订外卖,我们都会和提供服务的公司签订对应的“合约”。
但是我们可能面临提供服务的另一方不履约的风险,比如买房子时,地产商跑路,无法正常履行合约。
现在,有了区块链之后,我们就可以把各类合约搬到区块链上。
基于区块链可追溯、不可篡改的特性,部署到链上的合约都是透明公开的,每个人都可以看到触发规则和执行的内容,而且一旦触发之后就会自动执行,无人可以篡改或干涉。
这就是区块链行业常说的“智能合约”。
简单说,智能合约就是一个不可改变的、自动执行的程序。
通过智能合约这种方式,开发者们可以在以太坊上开发和部署去中心化应用,
一旦部署之后,智能合约的代码就不能被更改。不像是传统的软件,更改智能合约的唯一办法就是重新部署。
智能合约运行在以太坊的虚拟机(EVM,Ethereum Virtual Machine)中,EVM则运行在每一个以太坊节点上。
02 智能合约的编程语言
编程语言可以分为两大类别:声明式的和指令式的,也对应称为函数式的和过程式的。
声明式编程语言包括Haskell和SQL。
指令式编程语言包括C++和Java。
还有混合式的编程语言包括Lisp、JavaScript和Python。
尽管指令式程序代码更容易编写和阅读,大多数程序员也都在使用,但是却很难用于编写那些严格按部就班执行的代码。
声明式程序也许更难编写,但避免了副作用,从而更容易理解(和控制)程序的行为方式——程序的每个部分都是相互独立的,降低了理解程序的难度。
智能合约为程序员设定了一个很高的门槛:如果有bug,可能会损失大量的金钱。
目前,智能合约(Solidity)最为广泛使用的语言是指令式的。
Solidity是最流行的智能合约编程语言,进而成为以太坊甚至其他带有EVM的区块链平台高级编程语言的事实标准。
应用程序二进制接口(Application Binary Interface, ABI)是指两个程序模块之间的接口,通常,一个模块在操作系统层面,另外一个模块在用户程序层面。
API定义了高级的、供程序员阅读和使用的源代码接口,ABI则是向机器指令层面编码和解码并传送数据的主要方式。
在以太坊中,ABI用来编码合约中对EVM的调用和从交易中获取数据的调用。ABI的目的是定义合约中哪一个函数可以被调用,并且描述这个函数接收的参数和返回的数据。
03 智能合约安全
由于智能合约一旦部署,代码不能更改,
在实际的应用过程中,智能合约常常会出现三种基本类型的漏洞:
(1)可自毁合约:那些可以被任何地址杀死的合约。
(2)贪婪合约:那些一旦达到某个执行状态,就无法释放以太币的合约。
(3)慷慨合约:那些可以把以太币转给任意地址的合约。
怎么才能规避这些风险呢?
(1)最小化/简单化:复杂性是安全性的敌人。代码越简单,实现的功能越少,那么它产生bug或非预期效果的可能性就越低。
(2)代码复用:复用已经长久成功运行的代码,不要重复造轮子。
(3)代码质量:智能合约的代码是不可更改的。每个bug都可能会导致资金的损失,因此需要注重代码质量;
(4)可读性和可审计性:代码应该简洁并易于理解,越容易理解也就越容易进行审计。
04 新兴智能合约语言:Move语言
Move语言(Facebook的Libra项目的编程语言)基于Solidity语言(以太坊的编程语言)的经验和教训,进行了多方面的创新和改进,在安全性上有了大的提升,也更适用于智能合约的开发。
而基于Move语言的新公链们,也给 Layer1 的发展带来了更大的想象空间。
Move 语言被称为是最适合编写智能合约的语言,优于Solidity。
因为Move在诞生之初就被针对于区块链资产做了相关的优化,Move是为操作数字资产而生的语言,非常适合构建金融应用。
总的来说,在Move语言中,更强调资产和资源。
Move语言主要有三方面的改进:
1.减少了代码的安全漏洞
Solidity 和大多数编程语言一样,将 Token 或者加密资产当做一个数值来处理,资产转移的过程则是通过对账户进行数值加减来实现,例如 Alice 要给 Bob 转 10 个 token,就先将 Alice 的余额-10,再将 Bob 的余额+10。
在这个对多个资产账户进行加减的过程中就容易产生安全性漏洞,必须依赖于代码的严谨性,才能保证财产安全。
但在 move 语言中,资产被重新定义为一个 resource(资源)类型,不再是字符串或数值变量。
简单说,Move 的Token移动是转移,从一个账户转移到另一个,而 Solidity 则是加减法,先在一处减了,再在另一处加上。
Move的资源优先概念为程序员写出安全和有效的代码提供了很大的帮助。
2.避免了合约漏洞造成的损失
在 Solidity 中,数据集中存储在合约里,在合约出现漏洞的时候,一旦黑客获取到了合约权限,所有用户数据都将遭受攻击。
而在 Move 中,数据存储在拥有它的账户中,而不是合约中。Move 中有许多模块,模块是可以创建、转移、存储资产的程序,类似于以太坊中的智能合约。
Move 规定想要访问或者修改模块时,必须有模块所有者的签名,此功能允许在智能合约中维护数字资产的所有权信息和特权。
如果资产被发送到智能合约,所有权不会改变。在这种情况下,即使智能合约被攻击者攻破,资产也不会丢失。
3.优化了代码特性
Solidity 中的调用都是通过动态调用实现的,由于无法确定调用对象,所以可能造成循环调用,这带来了很大的安全风险。例如 TheDAO 攻击、PolyNetwork 跨链攻击,就是类似的事件。Move 语言吸取这些教训,选择了静态调用的设计,降低了运行时程序崩溃的可能。
同时,Move 团队为使用者开发了 Move Prover 工具,可以使用数学的手段来测试和证明合约的可靠性,开发人员可以在几分钟内运行测试,使他们能够在部署前就发现代码中的错误。
简而言之,Move 是专门针对区块链资产和智能合约而创立的语言,在安全性和可验证性上都大幅优于 Solidity。
05 以太坊虚拟机(EVM)
1.什么是EVM?
“虚拟机”是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
通俗点讲,虚拟机就是我们通过软件模拟出了跟我们个人电脑一模一样的虚拟机器,它拥有跟实际物理电脑同样的软硬件资源。
这样一来,我们就可以在这个虚拟机中随意运行程序,即使有病毒和攻击,也不会对真正的系统造成影响。
而以太坊虚拟机(EVM)就是建立在以太坊区块链上的一个虚拟机器,可以使得在上面运行的程序(智能合约)彼此隔离,并且与主链分离。
EVM是以太坊协议的一部分,它用来处理智能合约的部署和执行。
除了在EOA(由用户私钥控制的所谓“外部账户”)之间的简单转账交易以外,其他所有涉及状态更新的操作都是通过EVM来计算的。
从高层抽象的角度,运行在以太坊区块链上的EVM可以被想象成一个包含了数百万可执行对象的全球化的去中心化计算机,这些可执行对象都拥有它们各自的永久数据存储。
2.以太坊的状态
在以太坊中,有一个“世界状态”的概念,EVM的任务是基于以太坊协议以及根据智能合约代码的执行来计算状态转换,用以更新以太坊的世界状态。
简单说,你可以把EVM的运行想象为将以太坊世界状态复制到了一个沙盒中,如果执行因为任何原因没有完成,那么这个沙盒中的状态就会被丢弃。
如果执行成功结束,那么真正的世界状态就会被更新为这个沙盒的状态,包含所有对调用过的合约的存储数据的更改、新创建的合约以及其间所有以太币余额的转移等等。
因为所有节点的EVM都是运行在相同的初始状态,并且会输出完全相同的最终状态,所以整个系统就像是一台世界计算机。
3.合约部署代码
为了创建一个新合约,我们需要一个特殊的交易,其目标地址to字段需要被指定为0x0并且它的data字段需要被设置为合约的初始化代码。
新合约就可以使用部署时的以太坊世界状态,以编程方式被初始化,并更改合约的存储数据甚至发送以太币或者创建更多的新合约。
4.关于图灵完备
用简单的术语来解释,如果一个系统或者编程语言能够解决你交给它的所有问题,它就是图灵完备的。
图灵完备的问题是可能会出现有些问题需要无限的资源去解决。
如果它需要花费无限的资源去执行,我们也只能无限地等待下去才能知道结果。这就是所谓的“停机问题”。
有了Gas之后,消耗以太坊的计算能力,需要付出Gas费用,因此针对“停机问题”也就有了一个解决方案:如果在一个预先指定的最大计算量被用尽的时候计算还没有结束,那么所有处理都会无条件地停止。
这就使EVM成为一个准图灵完备的机器:它可以解决你交给它的所有问题,但前提是这个问题可以在一定量的计算量内被解决。
06 预言机
1.什么是预言机?
预言机(oracle)是可以为以太坊智能合约提供外部数据源的系统。
在理想情况下,预言机是无信任的系统,这意味着它们不需要被信任,因为它们是按照去中心化的原则运行的。
2.为什么需要预言机?
理想情况下,预言机提供了一种无信任(或至少近乎无信任)的方式来获取外在的(即“真实世界”或“链外”)信息,例如足球比赛的结果、黄金的价格或真正的随机数字,用于以太坊平台上的智能合约。
可以将预言机视为弥合链外世界与智能合约之间差距的机制,这样一来,智能合约就可以基于真实世界的事件和数据来执行合约规则,从而大大扩展了它们的应用范围。
3.预言机模型
根据定义,所有的预言机都提供了一些关键功能,这些能力包括:
· 从链外的数据源收集数据。
· 使用签名消息在链上传输数据。
· 将数据放入智能合约的存储空间,使数据可用。
设置预言机的三种主要方式可以分为请求与响应、发布与订阅和立即读取。
(1)立即读取
这种预言机提供即时决策所需的数据,例如“ethereumbook.info的地址是什么”或“这个人是否超过18岁”。
查找是在需要信息时完成的,可能永远不会再次查找。
这种类型的预言机一旦将数据存储在其合约存储中,其他智能合约就可以使用对预言机合约的请求调用来查找。
(2)发布与订阅
在这种预言机中,要对预期改变的数据(可能是定期和频繁地)提供有效的广播服务,预言机要么由链上的智能合约轮询,要么由链外守护进程监视和更新。
示例包括价格馈送、天气信息、经济数据、社会统计、交通数据等。
(3)请求与响应
“请求/响应”类别是最复杂的:这是数据空间太大而无法存储在智能合约中的情况,并且用户每次只需要整个数据集的一小部分。
4.预言机的数据认证
我们如何可以信任预言机传输的数据?
两种常见的数据认证方法是真实性证明(authenticity proof)以及可信执行环境(Trusted Execution Environment, TEE)。
(1)真实性证明是用密码学证据证明数据没有被篡改过。
基于许多证明技术(例如,数字签名证明),它们将
需要的信任从数据传输者高效地转移到证明人(证明方法的提供者)。
通
过链上验证证据,智能合约可以在使用数据前验证数据的完整性。
(2)TEE 则是采用基于硬件的安全区(security enclave)来验证数据完整性。
5.去中心化预言机
上面列举出的所有机制描述的都是中心化的预言机系统,都需要依赖可信的权威。
虽然它们可以为许多应用服务,它们的存在仍然意味着以太坊网络中的单点故障。
去中心化预言机可以用于保证数据可得性,还可搭配链上数据汇总系统创建独立数据提供者网络。
ChainLink目前是业内顶级的预言机,其提出了一个去中心化预言机网络,由三个关键智能合约(声誉合约、订单匹配合约、数据汇总合约)以及数据提供者的链外注册表组成。ChainLink
主要通过“
声誉
分数”
来保证数据的可信
。
最后
上文主要介绍了智能合约的定义、编程语言、合约安全、新兴编程语言,以及智能合约运行的环境——虚拟机,还有智能合约与外部数据交互的中介——预言机,基本覆盖了智能合约的各个维度。
就如文章开头所说,只有理解了智能合约,才能真正理解以太坊,智能合约就是以太坊的灵魂。
后续将继续介绍以太坊的应用层,我们具体看下去中心化应用的构成。
推荐阅读
详解以太坊:整体框架
公链生态纵览:浅析现有公链市场格局
··················END··················
你好,我是岳小鱼,一名在路上的产品经理。
会和你聊聊职场和产品经验,
也会漫谈生活、电影、读书。
希望我们能一起交流进步。
您可能也对以下帖子感兴趣
{{{title}}}
文章有问题?点此查看未经处理的缓存