Skip to main content

XiaoCheng

 · 

Web3 面试题(四)10题

Web3 面试题(四)10题(未完待续)

1、介绍下智能合约的发展背景

智能合约是区块链中四大核心技术之一,这个概念最开始是在1994年,由知名密码学家尼克·萨博(Nick Szabo)提出的,可由于技术以及其他的一些原因一直都没有落地,哪怕到了今天,智能合约已经在互联网中很多的应用,比如自动还款,无人机售货等等,也多是局限在个人和机构之间的智能合约,个人和个人之间的智能合约几乎没有,原因就在于“信任”问题,我们会发现,只要谈起合约,大多数都是陌生人跟陌生人之间有这种需求,而且还跟钱有关系,如果在没有第三方做担保的情况下我们之间做了个约定,我把钱打给你,结果你毁约了,不承认怎么办?所以智能合约一直没办法在个人与个人之间普及,后来随着区块链的出现,人们发现,区块链与智能合约十分的契合,因为区块链的很多特点,比如去中心化,数据的不可篡改等,可以从技术的角度,去解决陌生人之间的信任问题,这才使智能合约大规模的应用成为可能,这一阶段的开始以以太坊的诞生为标志。在区块链的基础上,以太坊应用了智能合约技术。智能合约使得以太坊可以实现更多功能,智能合约是一个非常重要的应用,于是,慢慢的,智能合约就成了区块链的核心技术之一。

2、智能合约的优势

  • 去中心化:智能合约的执行无需依赖第三方机构(中介)的参与或介入,合约的监督和仲裁都由计算机完成。
  • 不可篡改:智能合约一旦部署完成,所有内容无法修改,任何一方都无法干预合约的执行。这有点像传统世界的合同,一旦签订好后,无法修改。
  • 低成本:由于智能合约不需要第三方中介监督,一旦发生毁约,代码强制执行,与传统合同相比,具有更低的成本。
  • 公开透明:智能合约一旦部署成功,将按照设计代码运行,任何人均可查看,具有很高的透明度。

3、智能合约的劣势

智能合约并非没有任何缺点。由于智能合约代码一旦部署无法修改,这意味着一旦代码存在Bug极有可能被利用,因此智能合约容错率极低。

事实上,区块链的智能合约自诞生以来,被黑客攻击的次数不在少数,曾经轰动一时的The Dao事件便是其中之一。2016年,The Dao开启众筹,仅仅一个月时间募集到价值1.5亿美元的以太币,然而,就在众人欢庆之时,黑客发现了The Dao智能合约的漏洞,并对其发动了攻击,大量的以太币被黑客盗走。因为智能合约一旦部署无法修改,团队也无能为力,眼睁睁看着巨额资产逐渐流失。随后,以太坊创始人V神提出了回滚交易的方案,这也是区块链史上首次回滚交易时间,由于社区部分用户并不赞同回滚,从而导致了以太坊的硬分叉事件。

另外的案例,借贷协议bZx也曾多次因为智能合约代码漏洞遭到黑客攻击。2020年2月15日,bZx团队在官方电报群上发出公告,称有黑客对bZx协议进行了漏洞攻击,导致价值35万美元的ETH被盗;9月14日,DeFi借贷协议bZx再次遭到攻击,而这次攻击共造成了大约800万美元的损失。

4、说一些关于智能合约的应用

“智能合约”可以通过智能合约进行去中心化借贷

用户首先将以太坊(ETH)存入指定的资金池作为抵押,随后用户便可借出一定数量的稳定币DAI。由于存在抵押物,出借人也不同担心还不上钱的情况,当抵押物价值不足时,系统会自动触发清算,保证出借人的权益。

“智能合约”还可以用于众筹

项目方首先通过合约发起一个众筹,用户向该合约发送一定的ETH等代币,众筹完毕后,智能合约会自动向钱包发送该项目代币。2017年,大量的项目通过这种方式实现了融资,其中不乏优秀的项目,例如路印科技、波卡等等。通过这种方式,项目方完成了融资,为项目做大做强提供了稳定的资金;投资者则取得了丰厚的回报(例如2014年启动的以太坊众筹回报率超过1000倍,2017年BNB的众筹也取得了数百倍的回报率。)

“智能合约”还被应用在去中心化金融(Defi)方面

2020年,去中心化金融应用发展得如火如荼,这与智能合约的普及不无关系。

去中心化金融进一步细分可以分为借贷、交易、稳定币兑换、衍生资产等等,以Uniswap为例,用户在Uniswap成为流动性提供者可获得LP代币,随后,用户质押LP代币,可获得UNI,这一过程也被称为挖矿。

自流动性挖矿推出以来,Uniswap交易量爆炸式增长,成为全球最大的去中心化交易所,交易额一举超越美国最大的中心化交易所Coinbase。

5、智能合约的全链路

开发、编译、部署、调用

6、智能合约的分类

  • Solidity合约
  • Precompiled合约

7、Solidity合约代码结构

  • 状态变量:状态变量是永久存储在合约中的值
  • 构造函数:用于部署并初始化合约
  • 事件:事件是能方便地调用以太坊虚拟机日志功能的接口
  • 修饰器:函数修饰器可以用来改变函数的行为,比如自动检查,类似Spring的AOP
  • 函数:函数是合约中代码的可执行单元

8、CRUD合约

基于预编译合约和分布式存储设计的CRUD合约接口。

用户可以直接在合约中引用CRUD接口文件Table.sol,并在Solidity合约中调用CRUD接口。CRUD合约的开发完全遵从数据库的操作习惯,更容易理解和上手。

9、Solidity和Java的全链路对比

Solidity与Java的不同之处在于,Solidity是服务于区块链的语言,代码在区块链上执行。EVM是区块链上的一个执行器。每个区块链节点都有一个EVM。Solidity在EVM中被执行后,EVM对区块链的数据进行了改变。这些数据的改变交由共识算法去共识。同时,Solidity的操作仅限于EVM内部,不能访问外部不确定系统或数据,如系统时钟,网络文件系统等。

Solidity的设计目的,是给区块链提供一套统一的逻辑,让相同的代码跑在区块链的每个节点上,借助共识算法,让区块链的数据以统一的方式进行改变,达到全局一致的结果。

10、Solidity的运行细节

以此处的Demo合约为例,合约中有一个全局变量m,并有一个函数add(),实现给全局变量m增加x数值的功能。

在合约二进制被部署到区块链上后,通过发送交易调用合约里的方法。节点根据交易将合约代码装载入EVM中,并根据交易的传参执行合约上相应的函数add()。

EVM执行合约代码,从区块链上读入当前区块的数据,进行相加操作,并将结果写入下一个区块(等待共识的区块)对应的状态数据中。

此后,共识算法将待执行的区块共识落盘,区块高度增加,区块链上的数据完成更新。

这段Solidity代码的功能是存取_num字段。该字段被称为“状态变量”,会由区块链持久存储。

用户可以将这段代码部署在以太坊或类似的区块链上,部署成功就意味着该智能合约不可再被修改,只要底层区块链不被销毁,这段合约就一直存在。任何人都可通过“合约地址”来调用该合约接口,每次调用信息都会被记录在链上。

在讲解这段代码如何运行之前,我们先回顾下传统java程序的运行方式。

首先,用户编译完java代码后,会以字节码的形式保存在磁盘上;然后用户会调用程序,这由JVM来托管执行;程序执行期间可能会通过日志来记录调用参数,也可能会和磁盘进行IO。

Solidity的执行与此类似。不同的是介质由硬盘换成了区块链,由单机变为分布式。

代码部署后,以字节码的形式存储在每一个节点上。当用户要求调用某个函数时,调用请求将会被囊括在交易中,并被打包到某个区块上,一旦全网对该区块形成共识,就意味着调用是合法的。

接下来,EVM会来调用字节码,它负责存取底层的状态变量,好比传统编程的IO。

光从代码来看,合约开发似乎不过如此,单个合约只需要围绕着字段进行操作,对于很多简单业务而言,不过是CRUD而已。

但其复杂性也恰恰在于此,合约在区块链环境上执行,是不可修改的。

所以如果出现了bug,就必须部署新的合约,这对于合约的可维护性提出了挑战。并且,一旦业务复杂起来,容易出现安全漏洞,导致链上资产损失。同时,还要考虑完成代码编写、逻辑执行、数据存储的成本问题。

综上所述,写合约不难,但写好合约,却需要一定功底。

-------------------------

-------------------------

每日更新(未完待续)

User XiaoCheng Link web3网络知识

Download Pickful App

Better experience on mobile

iOS

Android

APK