oracle区块链开源项目,区块链Oracle原理及实现
区块链本身是封闭的。区块链的确定性模型基于这样一个事实:在交易执行时区块链不能执行任何来自外部的逻辑,所有的外部数据只能通过交易进入到系统中。预言机/Oracle就是通过交易为智能合约提供可信数据的服务。Oracle虽然听起来神秘,但实现并不复杂,在这篇文章里,我们将介绍预言机的作用以及运作原理,并通过天气数据预言机WeatherOracle的完整实现过程,来帮助 你快速掌握区块链预言机/Oracle的精髓。
要快速掌握区块链开发,推荐汇智网的区块链开发在线互动课程
1、为什么智能合约需要预言机/Oracle?
在智能合约中执行的逻辑不可以执行区块链之外的任何操作,例如它不可以访问互联网上的web服务。外部数据进入智能合约的唯一方法是将其置入一个交易中,通过向系统发送一个新的交易来触发区块链状态的更新。
试着考虑一下,如果智能合约在执行时可以访问外部的一个API来获取数据,会出现什么情况?
如果今天部署这个合约,那么API可能会返回如下的数据:
{ "foo": "bar" }
但是明天再部署时,API可能就会返回新的数据,例如:
{ "foo": "baz" }
那么可以想像,一个月以后如果有人进行以太坊区块链的同步,这个智能合约就会被执行,但是API的响应数据是和一个月之前不同的,这就会导致新同步的区块链状态不同于之前已经存在的节点状态。
这就不再是完全自确定的区块链了。经历相同的同步过程,我的区块链和你的区块链却不一样!
让我们再换个说法:给定一组区块,一个节点必须能够从零开始重现区块链的最终状态,而无需互联网连接。
那么这一点对于智能合约的开发者意味着什么?Oralce(预言机),开发者必须构造一个预言机来和实现智能合约与外部世界的交互。
2、如何实现一个简单的预言机/Oracle?
现在让我们创建一个简单的预言机/Oracle,来将外部的天气数据传入智能合约:
在最底层的区块链平台,我们需要部署一个智能合约,这个合约有一个方法updateWeather()用来更新天气状态,只有在合约白名单里的地址才可以调用这个方法。updateWeather方法接受天气数据作为参数,同时触发一个以太坊合约事件并将天气数据作为事件的参数,这样JavaScript应用就可以订阅这个事件并获得异步通知了。
同时我们将创建两个nodejs进程,其中之一就是预言机/Oracle,它的实现逻辑就是周期性地轮询第三方天气API来获取天气数据,然后将天气数据提交给智能合约以便进行历史审计。
另一个nodejs进程则负责订阅智能合约的天气事件,然后在控制台输出事件参数。正如之前所述,每当预言机/Oracle调用合约的updateWeather()方法时,都会触发天气事件。
需要指出的是,为了便于理解预言机的核心实现思路,下面的代码进行了简化,剔除了必要的错误处理,因此并不适用于生产环境。
源代码在这里:
接下来我们详细讲解这个简单的预言机的实现。
3、预言机智能合约实现
智能合约有一个公开的oracleAddress状态变量,用来表示允许调用智能合约的updateWeather 方法的账户地址,我们在构造函数中对其进行赋值:
contract WeatherOracle {
address public oracleAddress;
constructor (address _oracleAddress) public {
oracleAddress = _oracleAddress;
}
// ...
}
接下来我们要定义天气事件,这个事件将在weatherUpdate()调用成功时触发。同样为了简化,我们让这个事件简单的附带一个表示温度的字符串参数。
event WeatherUpdate (string temperature);
最后我们要实现updateWeather()方法。它的可见性为public,意思是可以从外部调用这个方法:
function updateWeather (string temperature) public {
require(msg.sender == oracleAddress);
emit WeatherUpdate (temperature);
}
请注意require语句。只有当调用地址(msg.sender)和白名单地址(oracleAddress)一致时才允许继续执行该方法,否则将回滚交易。
好了,就这么简单。
4、预言机服务
我们的预言机就是一个简单的nodejs服务。它使用request库来调用外部天气API,解析API的响应,然后构造并提交交易给智能合约,然后等一会儿,重复上面的工作,如此周而复始。
让我们从访问API开始,我们将API的地址放在一个环境变量里,以便在开发/生产环境切换时避免修改源代码:
const options = { uri: process.env.WEATHER_URL, json: true };
const start = () => {
request(options)
.then(parseData)
.then(updateWeather)
.then(restart)
.catch(error);
};
下面的代码用来解析API的响应结果:
const parseData = (body) => {
return new Promise((resolve, reject) => {
const temperature = body.main.temp.toString();
resolve({ temperature });
});
};
现在要做的就是构造一个调用智能合约的updateWeather()方法的以太坊交易。注意account()是一个异步方法,它的作用是载入一个以太坊账户,contract是一个js对象,它包含了之前部署的WeatherOracle智能合约的部署地址和ABI接口数据。这些与智能合约相关的函数都来自于著名的web3开发包:)
const updateWeather = ({ temperature }) => {
return new Promise((resolve, reject) => {
account().then(account => {
contract.updateWeather(temperature, { from: account }, (err, res) => {
resolve(res);
});
});
});
};
最后,我们只需要在指定超时后重新启动这个过程即可。 wait()函数将在指定的超时时间之后解析。
const restart = () => {
wait(process.env.TIMEOUT).then(start);
};
搞定了!上面的代码实现了一个简单服务,它可以从API获取数据,然后再输入智能合约。
注意:
当我们构造以太坊交易时,我们使用{from:account}来指定调用账户,account所指向的这个账户需要有一些以太币来支付交易的手续费。
我们使用环境变量来配置一个私钥,用来实例化account对象。这个私钥必须是用来部署 WeatherOracle智能合约时传入的那个白名单地址所对应的私钥。
5、天气事件的利用服务
这是另一个简单的nodejs服务。同样,contract是一个包含了合约的部署地址和ABI信息的js对象,调用WeatherUpdate并传入一个回调就是我们订阅天气事件的所有代码:
const consume = () => {
contract.WeatherUpdate((error, result) => {
console.log("NEW WEATHER DATA EVENT ON SMART CONTRACT");
console.log("BLOCK NUMBER: ");
console.log(" " + result.blockNumber)
console.log("WEATHER DATA: ");
console.log(result.args);
console.log("\n");
});
}
当这个服务运行时,随着交易成功入块上链,它将会周期性地向控制台输出数据:
NEW WEATHER DATA EVENT ON SMART CONTRACT
BLOCK NUMBER:
3424586
WEATHER DATA:
{ temperature: '74.75' }
oracle区块链开源项目,区块链Oracle原理及实现相关推荐
- 区块链开源项目Asch源码初探
Asch这个名字是 App Side Chain 的缩写. 是一种基于区块链跨链技术的应用开发平台,目前全部核心代码已经在GitHub上开源. 区块链是比特币的底层技术,但是名气低于比特币,但是个人认 ...
- 【邓侃】哈佛大学机器翻译开源项目 OpenNMT的工作原理
一. 哈佛大学机器翻译开源项目 OpenNMT 2016年12月20日,哈佛大学自然语言处理研究组,宣布开源了他们研发的机器翻译系统 OpenNMT [1],并声称该系统的质量已经达到商用水准. 在 ...
- python和区块链哪个好_10个最流行的Python区块链开源项目
Python不是主流的区块链底层平台开发语言,但是在DApp 开发.区块链仿真与数据分析.智能合约安全分析等领域,Python 依然是不错的选择.本文介绍了10个最流行的Python区块链项 并提供了 ...
- 揭秘京东区块链开源项目——JD Chain
导言 近日,京东区块链底层引擎JD Chain正式对外开源并同步上线开源社区,旨在为企业级用户和开发者提供开源服务,帮助他们提高研发效率,加速技术创新.3月30日,国家互联网信息办公室公布了第一批区块 ...
- 京东区块链开源项目——JD Chain介绍及区块链白皮书发布
导言 近日,京东区块链底层引擎JD Chain正式对外开源并同步上线开源社区,旨在为企业级用户和开发者提供开源服务,帮助他们提高研发效率,加速技术创新.3月30日,国家互联网信息办公室公布了第一批区块 ...
- YOUChain(有链)公链 开源项目介绍——go-bls
本文介绍YOUChain 加密签名方面的思考和方案,go-bls 库已于 github 开源,项目地址:[https://github.com/youchainhq/go-bls] YOUChain ...
- 京东区块链开源底层JD Chain版本升级,获工信部功能测试证书
京东区块链开源底层引擎JD Chain自2019年第一季度正式开源后,得到了诸多企业研发人员.个人开发者的使用反馈.结合这些来自实际应用场景方面的宝贵意见,攻城狮们经过数月的努力,使得JD Chain ...
- 京东数科区块链开源底层JD Chain版本升级,获工信部功能测试证书
点击「京东数科技术说」可快速关注 京东数科区块链开源底层引擎JD Chain自2019年第一季度正式开源后,得到了诸多企业研发人员.个人开发者的使用反馈.结合这些来自实际应用场景方面的宝贵意见,攻城狮 ...
- “开放共享与价值回归”2022开放原子全球开源峰会区块链分论坛成功举办
7月29日,2022开放原子全球开源峰会区块链分论坛在北京成功举办.分论坛以"开放共享与价值回归,Web3时代开源区块链创新"为主题,汇聚国内外区块链技术产学研各界专家代表,共同讨 ...
最新文章
- SNMP功能开发简介 五 使用MIB Builder创建MIB文件图文介绍
- nivicat复制mysql数据库[Err] [Dtf] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'错误
- 获取顺序容器vector,deque,string和array的首尾元素的方法有四个
- gdb 查看结构体地址内容_程序员的术与道:术——gdb基本操作
- 最好的Java开发人员测试和集成工具
- 程序简单教程:飞秋官方下载
- java get cookies_Java Cookie.getDomain方法代码示例
- android-hotfix(QQ空间思路)浅析
- 【讨论】不得不重视的问题:信息太多!信息太杂!
- C++使用using与typedef定义别名
- 高德sdk定位当前位置_高德地图定位,获取当前位置坐标
- STM32+GM65二维码识别模块
- 手机直播平台开发的解析
- android客户端设计,图文详解Android客户端界面设计教程
- 2月人民日报申论范文合辑(含获取方式)
- 跨平台,跨浏览器兼容性问题_跨浏览器兼容性检查的完整指南
- 饿了么App,网易云音乐,虎牙直播
- MOOS-ivp 实验三 MOOS简介(3)
- 【作业】非结构化数据相关知识整理
- BPF学习笔记(六)-- 使用bpf实现xdp的例子
热门文章
- Web Worker 简介
- Linux下/etc/mdev.conf学习
- 小圆圈o表示的数学符号是复合映射或Hadamard积(矩阵元素一一对应相乘)
- MT6755 datasheet资料,MT6755芯片处理器参数
- java中常用的时间格式yyyy-MM-dd'T'HH:mm:ss.SSSZ
- linux将gif合并成视频,如何将动图转化为视频?多张GIF图片合并成视频的方法
- 复变函数与积分变换---复数
- google/uuid
- Cartesi 举办的2023 黑客马拉松
- Java - 谷歌邮箱发送邮件详解