解锁智能合约3.0:如何通过预言机提升互操性
功能迥异的分布式账簿技术(DLT)协议既没办法交互,也没办法与DLT以外的系统连接。以Chainlink为主导的互操作性协议正在成为行业中标准化的互操作性解决方案,在各个系统之间实现安全的去中介化交互。
在区块链的早期发展阶段,人们普遍信仰的是“单链至上”,即一条区块链上包含Dapps端到端运行所需的所有功能。而如今盛行的理念则是一个模式中包含多个区块链协议,每个协议都拥有具体的功能。理念之所以发生转变是因为人们意识到数据量实在过于庞大,而且开发者的需求多种多样,仅依靠一个平台满足所有需求的风险实在太高。
因此又产生了一个新的问题:这些功能迥异的分布式账簿技术(DLT)协议既没办法交互,也没办法与DLT以外的系统连接。以Chainlink为主导的互操作性协议正在成为行业中标准化的互操作性解决方案,在各个系统之间实现安全的去中介化交互。
相互孤立的DLT堆栈
DLT目前的基础架构中存在许多不同类型的分布式账簿,每一种账簿都拥有具体的功能和优劣势。比如,BTC被广泛认为是储存价值的hj标准,因此它的优势是可靠性高、交易完全去中心化,但随之而来的劣势是功能单一、速度较慢。eth允许开发者添加条件表达式实现状态改变,以增强区块链的功能。然而,为了做到这一点,它付出的代价是将简单的编程语言换成了一种更加复杂的语言,这使得学习过程更困难,而且代码也更容易出现错误。btc和ETH都专注于完成某项特殊任务,因此都获得了成功。
如今的趋势不是开发出一条可以涵盖所有功能的区块链,而是专注于某一具体功能,这个逻辑与如今的互联网协议堆栈不谋而合。互联网并非一个包罗万象、庞大单一的协议,而是由各种协议组成的,每个协议都负责一个具体功能。协议堆栈通过分工合作的方式实现优化,并减少每一层协议受到的攻击强度,以此降低风险。
目前Web3.0的分布式协议堆栈中存在许多功能独特且实用的DLT协议web3.0是去中心化的互联网,用户在其中可以控制自己的数据、身份和体验。这些协议不断优化其核心功能,但彼此无法在web3.0中或在网络之外实现交互。
互联网堆栈的基础是传输控制协议和互联网协议(TCP/IP),这两种协议将数据打包,并在各个计算机/服务器之间来回传输。这有点像递送邮件的邮政服务。虽然区块链也在其系统内可靠地传输数据,但整个DLT生态系统中仍未建立标准化协议,因此Dapps无法实现跨网络交互和链下数据交互。
互联网赖以生存的另一个主要协议就是HTTP协议以及超文本传输安全协议HTTPS。HTTP协议允许web浏览器客户端向web服务器发送数据请求,如果请求被接受,用户就能访问网页。这个协议定义了数据格式和传输方式,还定义了浏览器在收到某个命令时应采取什么相应的行动。区块链需要TCP/IP协议在底层实现数据传输,同样地,它们也需要一个协议来规范数据传输的方式。HTTP协议在现有的TCP/IP堆栈上建立,并扩展功能,让用户能够浏览网页。这个协议的出现使得用户界面变得更简单,而且可以实现大规模的数据传输。
如果要开发可以应用在真实世界的去中心化应用,开发者既需要在不同系统之间实现数据传输,也需要建立一个标准协议规范数据传输方式。为了让DLT得到广泛应用,这些协议必须得让Dapps开发流程变得跟拖放式App开发一样简单。开发者可以选中某条区块链(可以选择公链或私链、速度优先或去中心化优先、以及具体针对的应用场景),连接至各种数据输入(数据、物联网、web API),然后使用多种数据输出(支付系统、云平台、其他区块链)安全可靠地进行结算。
要实现并规范数据传输,需要解决两个主要功能问题:
去中心化的资产交易所-互操作性更受人关注的功能是在协议之间互相交易本地资产。比如说,某人可以使用btc支付eth Dapp,或用btc兑换LTC进行支付。代币是区块链上的数据,因此资产交易在本质上最接近TCP/IP协议。
去中心化的消息数据交易所-互操作性的另一个不太受到关注的功能就是在协议之间传输消息数据。举个例子,IOTA上的设备可以传输物联网数据,触发eth上的智能合约,最终触发在btc区块链上进行支付结算。数据可以在两个分布式账簿之间进行传输,也可以在链上智能合约和链下系统之间进行传输。比如,来自路透社的链下市场数据触发链上衍生品智能合约,然后触发链下通过SWIFT码进行的法币结算。这个功能规范了系统中的消息数据如何触发底层区块链或后端系统的数据传输,在本质上最接近HTTP协议。
contract KittyLedger{
struct Kitty{}
priv let kitties:{Int:Kitty}
fun transfer(kittyId:Int,newOwner:AccountId){
if(msg.sender==kitties[kittyId].owner){
kitties[kittyId].owner=newOwne
}
}
}
transaction(signer:Account){
//tells the central ledger to assign ownership of
//myKittyId to a different account
centralKittyLedger.transfer(myKittyId,receiverAccountId)
contract CryptoKitties{
//Accounts store a collection in their account storage
resource KittyCollection{
//Each collection has functions to
//move stored resources in and out
fun withdraw(kittyId:int):CryptoKitty
fun deposit(kitty:CryptoKitty)
}
//The resource objects that can be stored in the collection
resource CryptoKitty{}
}
transaction(signerL Account){
//Remove the Kitty from signer's collection,and stores it
//temporarily on the stack
let theKitty<-signer.kittyCollection.withdraw(kittyId:myKittyId)
//Moves the Kitty into the receiver's account
let receiver=getAccount(receiverAccountId)
receiver.kittyCollection.deposit(kitty:<-theKitty)
}