本文摘要:Chainlink基本原理本文我们来从技术上详述一下Chainlink的基本原理。
Chainlink基本原理本文我们来从技术上详述一下Chainlink的基本原理。如果用最短的一句话说明什么是Chainlink,可以说道Chainlink一个去中心化的应验机项目,所以为了解读Chainlink的工作原理,我们首先要明白什么是应验机。应验机应验机的英文为Oracle,和知名的数据库服务提供商Oracle(甲骨文)混淆,但是两者除了名字完全相同以为并没任何关系。
Oracle这个单词是什么意思,下面是我在vocabulary.com上查出的Oracle的含义:Back in ancient times, an oracle was someone who offered advice or a prophecy thought to have come directly from a divine source. In modern usage, any good source of information can be called an oracle.中文的大约意思是:在古代,oracle是一个明确提出建议或应验的人,他的建议或应验被指出是必要来自于神。在现代用法中,任何好的信息来源都可以称作oracle。这样就不难理解了,Oracle表达了万能全知的神的圣旨,而甲骨文最初就是用来吉凶吉凶时的记录,也在当时也被指出是神谕,表达了神的意思。
所以不管是“应验机”还是“甲骨文”都传达了“信息源”的意思。计算机领域内的应验机一词,最先是图灵明确提出的。图灵在图灵机(Turing Machine)的基础上,重新加入了一个称作预言者(oracle)的黑盒,构成了应验机(Oracle Machine)。
所谓预言者,是一个可以问特定问题子集的实体。即它可以向图灵机系统内部输出信息,协助图灵机已完成运算。
以太坊的智能合约是“图灵完善(Turing Complete)”的,某种程度上可以看作一个图灵机,所以以太坊的设计者糅合这个概念,把向“图灵完善的智能合约”这个图灵机输出信息的也被称作应验机oracle。所以说道“应验机”这个名字并不是区块链技术领域内的独有概念,它源于十分早期的计算机抽象化设计,在密码学等领域内也都有类似于的概念。而在区块链领域,应验机被指出是可以为智能合约获取外部数据源的系统。从传统技术架构方面来看,应验机是相连智能合约与区块链外部世界的中间件(middleware),是区块链最重要的基础设施,它的起到是为区块链上的智能合约(Smart Contract)提供数据信息的。
正如以太坊的定义,区块链是一个交易驱动的状态机(a transaction-based state machine),它能做到的事情非常简单,就是通过向区块链递交事务/交易(transaction),来将区块链从一个状态转变成另一个状态。为了维持共识,EVM的继续执行过程必需几乎确认,并且仅有基于以太坊状态和亲笔签名交易的分享上下文。这产生了两个尤其最重要的后果:一个是EVM和智能合约没内在的随机性来源;另一个是外部数据不能作为交易的数据载荷引进。用通俗的话谈,区块链没主动获取数据的能力,它要用的只有区块链自己本身的数据。
数据的缺陷造成智能合约的应用于范围非常少,目前大部分的应用于都是环绕着token来进行的。区块链的确定性的意思是,在任何节点上,只要连进到区块链的分布式网络中,它就可以实时所有的历史区块,返释放出一套完全相同的账本。
换句话说:在没互联网相连的情况下,等价原始的块,节点必需需要从头开始新的创立区块链的最后状态。如果账本在构成过程中,依赖某个外部的API调用结果,那在有所不同时间有所不同环境下音频的结果就不会不一样。这种情况是区块链所不容许的,所以区块链在设计之初就没网络调用。
那么要构建向区块链提供数据,应当怎么做呢?区块链能留给的只有账本,而区块链所能输出的只有交易。我们就从这两个方面应从。
完全每一个合约系统,都会有事件记录的功能,比如以太坊中的EventLog功能。下面我们通过一个例子,来讲解一下应验机的基本原理。我们在以太坊链上创建一个用户合约,它必须提供到某个城市的气温数据。
当然,智能合约自己是无法提供到这个发生于链下真实世界中的数据信息的,必须利用应验机来构建。智能合约将必须提供天气温度的的城市载入到EventLog中,链下我们不会启动一个进程,监听并订阅者这个事件日志,提供到智能合约的催促之后,将登录城市的温度,通过递交transaction的方式,调用合约中的开挖方法,递交到智能合约中。声明:以下代码专供展示应验机原理,没做到参数检测和错误处理,请求不要在生产环境中用于。
消费者合约:contract WeatherOracle {// 用户存储应验机递交的天气数值uint256 public temperature; // 定义事件event RequestTemperature (bytes city); // 收到提供催促,即收到一个事件日志function requestTemperature (string memory _city) public {emit RequestTemperature(bytes(_city));} // 应验机消息传递方法,应验机提供到数据后通过这个方法将数据递交到链上function updateWeather (uint256 _temperature) public {temperature = _temperature;}}上面的代码非常简单,定义了一个变量用来存储结果,一个方法用作发出请求,一个方法用作接管结果。链下,我们启动一个进程,以订阅者topic的方式提供日志信息,之后通过建构一个transaction,递交一个结果到合约中。func SubscribeEventLog() {topic := crypto.Keccak256([]byte("RequestTemperature(bytes)"))query := ethereum.FilterQuery{Topics: [][]common.Hash{{common.BytesToHash(topic),},},} // 订阅者涉及主题的日志事件events := make(chan types.Log)sub, err := EthClient.SubscribeFilterLogs(ctx, query, events) // 读取合约的ABI文件ta, err := abi.JSON(strings.NewReader(AbiJsonStr))// 监听事件订阅者for {select {case err := -sub.Err():log.Error(err)breakcase ev := -events:// 提供到订阅者的消息ej, _ := ev.MarshalJSON()log.Info(string(ej)) // 解析数据var sampleEvent struct {City []byte}err = ta.Unpack(sampleEvent, "RequestTemperature", ev.Data)log.Info(string(sampleEvent.City)) // 建构交易递交结果,网卓新闻网,必须获取私钥用作签订交易CallContract("b7b502b...164b42c")}}}func CallContract(keyStr string) {addr := PrivateKeyToAddress(keyStr)nonce, err := EthClient.PendingNonceAt(ctx, addr) gasPrice, err := EthClient.SuggestGasPrice(ctx) privateKey, err := crypto.HexToECDSA(keyStr) auth := bind.NewKeyedTransactor(privateKey)auth.Nonce = big.NewInt(int64(nonce))auth.Value = big.NewInt(0)auth.GasLimit = uint64(300000)auth.GasPrice = gasPrice instance, err := event.NewEvent(common.HexToAddress("0x8A421906e9562AA1c71e5a32De1cf75161C5A463"), EthClient) // 调用合约中的updateWeather方法,开挖数据"29"tx, err := instance.UpdateWeather(auth, big.NewInt(29)) log.Info(tx.Hash().。
本文来源:星空体育(StarSkySports)-www.okmjr.net