为什么区块链无法主动获取外界数据
区块链的特点
区块链是一个封闭的确定性系统,每一笔交易都需要不同节点共识,只有超过一定数量的节点共识成功,交易才会被真正认可,并写入区块链。
因为对于外部API的调用并不是一个确定性操作,所以智能合约没有实现外部API调用的功能。除此之外,因为交易广播到其他节点时,各个节点执行交易的时间不一致,所以获取的数据可能不同。比如A节点执行一笔交易,其中调用了一个APICall,在把这个交易打包入块让别的节点去验证的时候,其他节点也需要执行这个APIcall,执行时间跟打包交易的节点执行时间不一样,得到的结果不一定相同,从而共识失败,导致交易无法写入区块链中。
区块链中的随机数
随机数在区块链应用中有大量的应用场景。
随机数的生成,同样是一个不确定的操作,因为随机数的生成是不可预知的,所以不同的节点,在执行时得到的随机数算法的时候,得到的结果肯定不一样,因此会造成交易执行结果不一致性从而无法达成共识。
通过外部预言机输入可验证的随机数,让链上智能合约只接受并且验证随机数,就可以保证交易执行的一致性。同时还可以实现随机数不可提前预知,并且可以通过证明保证其安全性。
预言机
由于智能合约无法调用外部API这一特性,所以诞生了预言机这个机制用来帮助智能合约获取外部数据,除了应用最广泛的价格数据以外,还包括一些天气数据,体育比赛数据,股票市场数据,交通数据,甚至包括总统选结果等数据。
除了提供数据,预言机广义上的功能也包括提供随机数和作为触发器实现智能合约执行,它们都算是链下的工具来和链上的合约进行交互。
中心化预言机的原理
在架构上,预言机分为两类,中心化预言机和去中心化预言机。最初的预言机解决方案中以中心化预言机为主。最简单的方式就是在链下搭建一个服务器,服务器从不同数据源获取数据。然后由开发人员在服务器中写一个脚本,根据时间间隔或者链上智能合约的状态,通过服务器把数据发送给链上合约。
中心化的预言机问题
对于中心化预言机而言,网络故障或者宕机都会造成业务中断,导致用户无法及时获取数据。除此以外,中心化意味着运营方的单当中心化预言机发现一些DeFi协议或者NFT项目中依赖于它的数据,也不排除提供恶意数据获得利益的可能。上述情况的发生很难避免,我们称它为单点失败风险。
Chainlink预言机
另一类是去中心化预言机,Chainlink预言机就是一个去中心化预言机网络。
Chainlink基于自身的预言机网络可以给链上的智能合约提供多项服务,比如说“喂价”,合约的自动化执行,生成可验证的随机数,获取任意外部的API数据,甚至能够把链上智能合约的一些计算或判断放到链下完成,然后返回结果,从而节省gas费。
Chainlink如何解决单点失败风险
Chainlink预言机把中心化预言机节点替换为去中心化网络,在网络中有很多预言机节点,每个预言机节点都可以通过自己的渠道去获取数据,然后在去中心化网络中对获得的数据进行共识。这里的共识方式并不是BFT,POS,POW这个意义的共识,而是为了获取可靠的数据,比如说取平均数;或者类似于体育比赛里面,去掉一个最高分,去掉一个最低分,剩下的取平均数或者中位数,现在Chainlink采取的是中位数的共识方式。
Chainlink把预言机通过去中心化的网络,在技术上避免了单点失败的风险。如同以太坊节点,当一个节点中断或者退出时,不会影响到整个网络的安全性和可用性。另外在这个数据上,由于采用多种数据源,所以不会被一个单方面数据源所操控,充分地利用了去中心化的优势。
Chainlink对自身的去中心化预言机网络外推出了很多服务,第一个服务是ChainlinkDataFeeds,可以为链上智能合约喂价。
预言机网络架构
在ChainlinkDataFeeds中,不同的预言机节点,通过自己的数据提供商获取价格数据,然后通过预言机网络对多个数据聚合后。比如一个token价格,A节点报价是400,B节点报价是400,B节点报价是39C节点报价是40预言机节点将所有的报价进行共识后,会把价格中位数40预言机节点将所有的报价进行共识后,会把价格中位数400传给链上的智能合约,完成此次喂价。
DataFeeds业务流程
Datafeeds的业务流程涉及两个参与方,第一个是数据提供商,它们会使用自己的数据,或通过第三方获取相应的数据,之后输入到Chainlink预言机网络中的一个节点。另外一个参与方就是预言机节点,每个节点可以有一个或者多个数据提供商,每个提供商输入的数据都会在预言机网络里中进行共识,然后网络中会随机选取一个节点,由该节点提交数据到链上。
Datafeeds在链上会部署一个叫做Aggregator的合约,内部使用Mapping存储节点网络聚合后的中位数价格。对于用户合约,可以调用Aggregator函数,获得相应的价格数据。
DataFeeds数据更新
ChainlinkDataFeeds支持多个不同的区块链网络,如BNB,Solana,Polygon等,可以在DataFeeds页面找到目前支持的网络和价格数据。同时对于每个价格数据,都有相应的参数控制数据的更新频率,以保证数据的实时性和有效性。
拿ETH对USD价格举例,这里有两个参数,第一个参数叫Deviationthreshold。如果当前聚合价格对比最近一次更新的价格,波动率超过0.5%,预言机需要立即更新ETH的当前价格。另一个是heartbeat,距离上一次价格更新时间间隔超过1个小时的话,预言机网络就会进行新一轮的更新。需要说明的是,当Deviationthreshold触发更新后,Heartbeat会重置为1小时,重新开始计时。
节点背书机构
从上面还可以看到提供价格数据的节点信息,包括节点的数量,节点提供的价格数据,以及节点运营商。可以看到很多大型机构参与了Chainlink预言机网络,包括T-Mobile、SNZ、SyncNode等,后续Chainlink还会进一步扩大合作机构,提供更加稳定和安全的去中心化的喂价服务。
DataFeeds技术架构
ChainlinkDataFeeds主要包含了三个合约,第一个是Consumer合约,第二个是Proxy合约,第三个就是刚才提到的Aggregator合约。Proxy合约作为接口连接Consumer合约和Aggregator合约,屏蔽了Aggregator的复杂性,对外向用户提供一个统一的接口,返回预言机网络最近一次的价格数据。
DataFeeds用户案例
Datafeeds应用场景非常广泛,很多主流DeFi项目都集成了DataFeeds。
最常见的一个应用场景是借贷协议,比如Ethereum上的AAVE,Compound,BNB上的Venus。当用户在AAVE上存入一个BTC然后贷出来USD时,AAVE需要知道BTC和DAI的兑换比例,才能决定给用户贷多少USD。
第二个应用场景是合成资产,比如Synthetix,它可以让用户去交易一些主流资产,比如美股股票。用户合成资产时,协议肯定需要知道资产价格,这个价格就是通过DataFeeds获取的。
第三个应用场景是抵押型Stablecoin。抵押型Stablecoin要发行的话,需要抵押相应的资产。Stablecoin的协议需要通过DataFeeds获取资产的价格后,才可以计算得出抵押资产的总价值,根据总价值决定Stablecoin的发行数量。
第四个是资产管理和衍生品的交易平台。像期权、期货交易平台,它们对价格都很敏感,需要提供稳定、准确的价格数据,DataFeeds提供的数据完美的满足了它们的业务需求。
DataFeeds合约解析
合约源代码
合约关联关系
上面我们提到用户是通过调用Proxy来获取价格数据,对应的具体合约为AggregatorProxy代理合约。使用代理合约的目的在于预言网络根据需要会进行更新,因而预言机节点发送的数据格式也会有所不同。如果用户合约直接使用Aggregator合约读取价格数据,当数据格式发生变化时,有可能有服务中断的风险,即用户合约无法及时获得价格数据的风险。基于上述考虑,Chainlink官方针对于每一个价格对,会部署一个Aggregator合约,用户不直接使用aggregator合约,而是通过Proxy合约获取aggregator中的价格数据。
AggregatorProxy继承AggregatorProxyInterface接口,实现了其中的phaseAggregators、phaseId、proposedAggregator等接口,同时还额外给用户提供了latestAnswer、latestTimestamp、latestRound、latestRoundData等接口,用以获取更新时间戳、轮次等。
上一个版本中,AggregatorProxy对应的Aggregator的实现为FluxAggregator,其中Flux为预言机网路共识机制名称。在2021年初,Chainlink对预言机网络进行了升级,共识机制变更为OCR,节点喂价效率提升了10倍。
OCR和Flux的区别可以简单理解为,Flux机制中,节点把数据提供商的数据统一上报到链上,在链上完成数据的聚合。我们知道,链上计算不仅需要消耗gas,而且会耗费很多时间。而在OCR机制中,数据在预言机节点网络中完成聚合,最后由其中一个节点上报到链上,节省了大量的gas和计算时间,效率因此得到大幅提升。
智能合约自动化执行
正如智能合约无法主动获取外界数据一样,也无法自己触发自己。在没有自动化工具之前,智能合约都是由开发者手动触发的。对于小型项目方,需要自己在服务器上写一段脚本,每次通过私钥去触发合约交易,这样不仅存在曾经提到的单节点风险,并且会占用团队的时间和资源。
除了手动触发以外,还可以通过Bounty模式实现智能合约的自动执行。挖过YFI的人都知道,曾经一段时间,YFI需要用户手工点一下Claim,才能把收益发到各个用户的钱包里,每次点击的人会发一些额外的奖励,这就是Bounty模式。有一个著名的项目叫ETHAlarmClock,可以给某个时间点去触发某个交易的人汇一些赏金。它的问题在于只有一个人能成功触发交易,而成功触发的人会获得所有奖励,这会导致Gas竞赛。为了成为成功触发的那个人,大家不断增加GasFee,导致了链的拥堵,就像是抢NFT一样。但是实际上,在这个场景中,只要一个人去调用函数就可以了,很多人抢会造成了不必要的浪费。
去中心化自动化执行工具
ChainlinkKeepers是的一个去中心化合约执行服务,可以实现链上合约的自动化执行。
开发团队可以注册一个UpKeep,每个区块中都会去检测一下监控的的合约状态,如果符合预设条件,就调用函数,当然也可以不设置预设条件,根据时间来调用特定合约中的特定函数。
ChainlinkKeepers可以在不需要输入的情况下,不断地根据预设的逻辑去检测智能合约的状态,如果满足的话就执行,不满足的话,等待下一次检测。
Keepers业务流程
ChainlinkKeepers首先调用UpKeep合约里面的检测函数,执行函数中的条件判断,判断条件结果为True或者False,如果是结果为False就跳过,在下一个区块重新检查。如果为True,会通过UpKeepRegistry合约调用UpKeep合约的PerformUpKeep函数,用户可以在PerformUpKeep中定义具体的执行逻辑。
Keepers技术架构
KeepersCompatible是用户合约,为了保证KeepersRegistry能成功回调,KeepersCompatible合约需要实现两个函数,一个是checkUpKeep,另一个是performUpKeep。KeepersCompatible只有在KeepersRegistar中注册成功后,预言机节点才能通过checkUpKeep判断是否需要执行performUpKeep。
具体注册、调用流程如下:
首先KeepersCompatible调用KeepersRegistrar合约的register方法进行注册。链下预言机调用KeepersRegistrar中的approve批准该注册,将KeepersCompatible中的checkUpKeep写入KeepersRegitstry。之后链下预言机网络在每个区块中都会调用KeepersRegistry中的checkUpKeep检测KeepersCompatible是否满足触发条件,如果为True就会调用performUpKeep函数执行后续逻辑。如果检查结果为False,则在下个区块中再调用checkUpkeep进行检测。
Keepers用户案例
第一个应用是自动复利。很多DeFi应用会支付利息给存款用户,用户如果不提款,就相当于是单利,简单的说就是存一年给一年的利息。如果用户每隔一段时间将产生的利息提出来再存入,进行复利投资,就可以将收益最大化。这提取和存入的操作,是一个按照时间而定的固定操作,可以通过Keepers去完成操作,比如Beefy,Alchemix,SNX等项目都是通过Keepers完成这种复利投资。第二个应用是借贷平台的清算,如AAVE和B-protocol。当用户在协议中的质押资产价格下跌,跌到警戒线以下,协议就需要把抵押物清算掉以避免进一步的损失。按照这个场景,checkUpKeep函数里面可以写标的物拍卖的清算价格,performUpKeep写具体的清算逻辑。checkUpKeep返回为Ture时,Keepers自动执行performUpKeep里面的对质押资产进行清算。第三个应用是DEX限价单。DEX中使用的自动做市商不同于中心化交易所的订单簿模式,没有办法进行限价单。如果想用limitorder,需要自己编写逻辑,当通证价格低于某一个阈值时,去购买或者卖出,也就是用Keepers,在checkUpkeep里写判断逻辑,在performUpkeep里写执行逻辑。第四个应用是流动性管理和跨链NFT铸造,比如在Polygonmint一个NFT,得到ID或者features属性值,这个数值可以通过relay写回到主网,帮助用户实现跨链铸造NFT。第五个应用是动态NFT。它的逻辑是区块链上的NFT,会随着现实世界中相关属性的变化而变化。比如天气NFT,外界下雨NFT就显示下雨,外界很热NFT就显示一个太阳。从外部获取数据,根据所获取的数据做出一些改变,这里就会频繁使用Keepers。
VRF算法
Chainlink的第三个去中心化产品是可验证随机数VRF。在VRF出现之前,主流的生成随机数的方法是根据当前区块中的交易生成Hash,使用这个Hash作为种子生成随机数,由此引出了MEV问题。矿工可以选择性打包交易,得到他们想要的随机数,虽然成本比较高,但当利润回报很高时,矿工作恶的可能性也会相应提高很多。
在ChainlinkVRF中,随机数是由预言机网络生成。用户传入一个种子给VRF合约,预言机VRF节点会使用节点私钥和种子生成一个随机数和Proof返回给VRF合约,VRF合约Proof验证随机数的合法性,如果通过验证,就会把随机数返回给用户。跟单纯链下生成随机数不同的是,ChainlinkVRF生成的随机数可以通过Proof证明它是根据特定椭圆曲线算法算出来的,具有可验证性、独特性。
VRF特点
VRF本身是一个随机算法的名字,在1999年由Micali、Rabin和Vadhan首次提出VRF这个概念。
相比其他算法,VRF有三个主要特点:
第一点是可证明性。它在输出随机数的时候,同时要输出一个Proof,这个Proof可以证明这个随机数不是生成者直接生成的,而是根据输入的种子与自己的私钥去生成,用户可以根据它的公钥和Proof去验证。第二个点是独特性。每个种子生成的随机数都是唯一的,一个种子不能生成多个随机数。这样可以保证预言机无法生成多个随机数,从中挑选一个对自身有利的随机数返回给链上智能合约。第三个是伪随机性。所有根据算法产生的随机数都是伪随机数,没有加入现实世界中的温度、风速等变量作为种子的一部分去生成随机数,因为如果采用这些变量,用户在验证时无法复制这些变量,从而无法进行验证。
VRF算法由三个函数构成:
第一个是公钥私钥对生成函数,用于生成签名用的公私钥对。第二个是随机数生成函数。接受用户传入的种子,加上节点自身的私钥,生成一个Randomness随机数。除了随机数外,还会生成一个Proof,证明这个随机数是节点根据种子加私钥,然后依据固定算法生成,不是乱生成的。第三个是验证函数。节点把随机数和Proof返回给链上合约时,链上合约根据节点公钥、种子、生成的随机数、Proof,验证随机数是不是使用随机数生成函数生成的。验证成功返回True,验证失败返回false。
VRF这三个函数就是使用ChainlinkVRF的三个步骤。预言机节点生成密钥对时,会把公钥公布并且保存在链上验证合约中,私钥保存在节点内部。之后用户发起一笔交易到VRF链上合约去请求随机数,合约在区块中生成EventLog,并在其中记录用户传入的种子。预言机节点监听到这个EventLog后,生成随机数和Proof发回给VRF链上合约,合约验证通过则写入随机数到用户合约,否则不写入,这就是整个VRF的实现过程。
VRF技术架构
用户Consumer合约不直接跟预言机节点交互,而是通过Coordinator合约协助。就像Keepers一样,用户需要在Consumer合约中实现特定的函数,以便接受Coordinator合约回传的随机数。这里需要实现的回调接口为FulfillRandWords,具体调用流程如下:
用户在Consumer合约中调用Coordinator合约的RequestRandomWords接口请求VRF随机数。Coordinator合约收到请求后,生成EventLog,并在其中写入Metadata等配置信息。链下预言机监控到出现EventLog后,提取里面的配置信息,结合当前的区块Hash算出一个种子,具体算法为用户Seed加区块哈希再生成一个新的哈希作为最终Seed。
预言机节点根据种子和自己的私钥计算得到随机数(randomness)和Proof,然后调用Coordinator合约的FullfillRandomWords接口进行回传。Coordinator合约对收到的随机数和Proof进行验证,验证成功以后通过FulfillRandomWords接口把随机数返回给Consumer合约,最终用户就收到这个随机数了。
至于随机数的使用,用户可以在FulfillRandomWords接口中实现,也可以编写另外的函数去实现。Coordinator合约调用Consumer的FulfillRandomWords接口时有callBackgaslimit限制,当FulfillRandomWords接口中消耗的gas超过这个limit时,Coordinator会调用失败,导致无法传递随机数给iConsumer合约,所以FulfillRandomWords接口中避免实现复杂的逻辑,最好只做一个随机数的存储,然后通过另外的接口去使用。
VRF用户案例
ChainlinkVRF目前最大的应用场景是NFTMint。NFT需要创建、分发,创建的时候,每一个NFT的稀有度不同,分配的用户不同。根据业务需要,有可能还要设置白名单,白名单里面的holder空投不同的NFT。比如无聊猿猴项目,空投serum血清给Holder,血清的随机空投就是用的VRF随机数。
另一个应用是抽奖。比如一些IDO平台,用户购买通证,然后去质押通证,平台会赠送白名单参与抽奖,奖励的大小就可以使用VRF进行选取。
具体的使用场景还有挺多的,除了加密货币领域,甚至在现实生活中,比如说摇号买房、摇号买车或者品牌营销抽奖,其实也都可以使用VRF,相信在不远的将来,可验证随机数会成为随机数场景中的主流应用。
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点