区块链预言机(Oracle)是一种第三方去中心化数据服务,可以为智能合约和区块链提供链外数据。 预言机在封闭、确定性的区块链系统与现实世界之间搭建了一座桥梁。

区块链开发教程链接: 以太坊 | 比特币 | EOS | Tendermint | Hyperledger Fabric | Omni/USDT | Ripple | Tron

区块链预言机的主要问题是,它不是区块链共识机制的组成部分,因此没有区块链的公共基础设施提供 的基本安全保证。Chainlink是目前的行业标准,提供了一个鲁棒的解决方案。

Cosmos是构建多资产的、PoS共识的自定义区块链的一个出色的开源框架。 每个Cosmos程序都运行在PoS共识引擎Tendermint Core之上。

自定义区块链意味着Cosmos没有采用以太坊那样的虚拟机区块链范式,即使用状态机运行智能合约, 虽然你也可以利用Ethermint让自定义区块链支持智能合约。

Chainlink目前广泛地用于以太坊智能合约,整个过程大致如下:

  1. 你的智能合约与预言机合约智能合约进行交易,该合约会触发一个事件
  2. 链下的chainlink节点通过订阅预言机事件就可以在交易时得到通知。
  3. 当合约事件被记录下来时,它会执行一些链下的操作,并调用预言机合约函数并传入所执行工作的结果。
  4. 最后,预言机合约会调用你的合约上的回调方法并传入收到的链下数据。

从这个描述中,我们可以清楚地看到,智能合约是整个过程中的关键。你的智能合约不与任何链下API 或资源 通信 - 仅与另一个智能合约交互。

那么,基于cosmos的自定义区块链,在没有智能合约的情况下,如何实现预言机呢?老实说我不确定。 我知道的唯一类似的项目,是Kava区块链在其系统中集成了Chainlink价格预言机。 他们使用一个可以发布链上价格数据的预言机白名单。当Kava平台用户想要价格数据时,他们可以查询保存的 所有价格数据或预言机发布的所有价格的中间价。

据我所知,Chainlink也在尝试建立一个模块,完成类似的功能。

在我不得不考虑这个问题的一小段时间里,我想出了两个解决方案。我相信有更好的方法来解决这个技术问题, 所以请随时使本文的评论部分成为集思广益的创意中心。

1、解决方案 1

一种解决方案是,预言机运营商在自定义区块链上创建一个钱包。然后,它使用 WebSocket来监听涉及 该地址的交易。当它记录到此类交易时,就执行一些链下操作,一旦完成,就将交易发送到上一笔交易的来源地址。

它将允许按需启动预言机请求,预言机将能够执行任何工作——而不仅仅是发布价格数据。

目前,这可以利用Chainlink预言机完成。预言机运营商可以在区块链上注册钱包,并使用 外部启动器 和外部适配器提供服务。

2、解决方案 2

第二个更可靠的选择是在Cosmos上创建一个预言机区块链,这将作为Chainlink节点和Cosmos 生态系统之间的通信点。它将Chainlink的所有 API 暴露在用Cosmos构建的每一个区块链中。我们甚至 可以在预言机区块链中构建安全机制,以验证链外数据的完整性。

听起来对Cosmos生态系统来说这是一件非常有价值的事情, 那么应该怎么实现?

预言机区块链使用前面提出的第一个解决方案,这意味着预言机将使用WebSockets订阅来自其他Cosmos 区块链上来自预言机区块链上的交易事件。这些事件包含的信息,允许预言机节点确定它必须执行什么工作。 成功执行后,从预言机区块链向客户端区块链提交一个交易。

最近推出的链间通信协议 (IBC)使上述方案 变得可行。简言之,IBC是一个允许Cosmos区块链之间端到端、可靠和经过验证的通信的协议。任何Cosmos区块链 都能够执行与预言机区块链通信的协议。

显然,我不会在本文中实施这第二个解决方案,因为它需要大量的规划、架构和编程,并且会让你失去继续读下去的兴趣。 但是,从长远来看,我确实计划将此成为现实,因此,如果你有兴趣,请留意我的更新或与我保持联系。

我们将在以下段落中实施第一个解决方案:创建一个Cosmos区块链,并使用Chainlink从互联网上获取随机报价。

为了保持这篇文章的合理长度,我们将代码编写的尽可能简洁。不过还是有相当多的步骤和代码需要我们完成。 我知道这很复杂,但这将是值得的。

我们必须:

  • 在Cosmos上创建一个简单但有效的区块链,能够存储并检索随机报价。虽然除了作为示例外,它不是很有用。
  • 创建Chainlink外部启动器,该启动器将监听区块链上的交易并触发预言机。
  • 创建Chainlink外部适配器,该适配器将从公共 API 中获取随机报价并将其发布回我们的区块链。

现在是时候卷起袖子,戴上安全帽去上班了!

3、创建区块链

我实现了一个最小功能的区块链,用于预言机报价请求和报价创建。下面,我将展示如何从头开始的基本知识, 但不会解释如何构建整个示例应用程序,因为这不是本文的重点。

如果你想直接上手代码,可以点击此处查看 GitHub仓库:

让我们开始创建Cosmos区块链。最简单的方法是使用starport工具,你可以GitHub安装。

打开终端运行:

1
starport app github.com/lajosdeme/linktest

上述命令将创建一个名为”linktest”的cosmos应用程序。你可以进入linktest文件夹并运行starport serve以 生成和运行这个区块链。运行结果类似下面这样:

这个区块链目前还没有太多功能。基本上,它所做的就是运行 Tendermint 共识引擎,并提供最小功能, 在地址之间交易。我们下面就要实现业务逻辑了。

从上面的终端输出,可以看到,我们可以在端口26657与tendermint互动。共识引擎会发出不同的事件, 我们可以通过 WebSocket 订阅它们。让我们用命令行和postman说明一下这其中的工作原理,然后我们可以 继续实现Chainlink外部启动器。

打开Postman,然后单击File ->New -> WebSocket请求。在顶部输入ws://localhost:25657并单击Connect。 现在,让我们订阅所有交易事件。在消息字段中粘贴以下信息,然后单击Send:

1
2
3
4
5
6
7
8
{“jsonrpc”: “2.0”,“method”: “subscribe”,“id”: 0,“params”: {“query”:”tm.event = ‘Tx’”}
}

就是这样。我们用WebSocket连接共识引擎。现在是时候利用一个交易来测试一切正常。以下是我们需要的命令:

1
linktestd tx bank send <SENDER_ADDRESS> <RECIPIENT_ADDRESS> <AMOUNT>

例如,对于我来说,带入实际参数后是这样:

1
2
3
4
linktestd tx bank send \cosmos1fztn5xte9c0gqfhjrf5a8vuqz9d2p6wf90ez72 \cosmos1f0g0m92f6s405vww6n0kgjwcqfxyf8fjnzyuff \10token

让我们回到Postman那里,在那里我们可以看到交易已被记录。我们的外部发起人将做同样的事情,并触发 预言机节点的工作。

4、创建Chainlink外部启动器

外部启动器是使Chainlink节点 与区块链无关的秘密武器,即任何区块链都可用。

外部发起人允许根据某些外部条件在节点中启动作业。创建和添加外部启动器到Chainlink节点的能力 实现了跨链兼容性。 - Chainlink文档

虽然您可以按照代码执行,但如果你也希望能够运行并测试代码,则应在本地或云中设置Chainlink节点。 要设置本地节点,请按照此教程执行。一旦你有了自己的节点, 打开.env文件,并确保它包括以下内容,以便禁用以太坊并启用外部启动器:

1
2
3
ETH_CHAIN_ID=0
ETH_DISABLED=true
FEATURE_EXTERNAL_INITIATORS=true

现在是时候登录到节点的管理员设置,以便添加发起人:

1
chainlink admin login

现在可以注册它:

1
chainlink initiators create linktest http://localhost:6688/jobs

这将创建一个名为linktest并使用默认端点访问Chainlink节点作业的启动器。输出将是这样的:

复制并保存这些值,因为我们下面还需要它们。

现在使用命令chainlink node start启动你的Chainlink节点,并前往浏览器http://localhost:6688。 登录并选择顶部导航栏中的”Bridges”。然后单击”New Bridge”,输入名称(我的是link-ea)和URL(http://localhost:3000)。 可以暂时将最低付款和确认数设置为0。最后单击”Create Bridge”。

外部适配器通过创建桥类型添加到Chainlink节点中。桥定义了外部适配器的任务名称和网址。当收到不是 核心适配器之一的任务类型时,节点将搜索带有该名称的桥类型,将桥用于外部适配器。 - Chainlink文档

现在前往顶部栏中的”Jobs”,选择”New Job”,并将此粘贴到”Job Spec”中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{“name”: “LINK-EA”,“initiators”: [{“type”: “external”,“params”: {“name”: “linktest”,“body”: {“endpoint”: “random”}}}],“tasks”: [{“type”: “link-ea”}]
}

这告诉Chainlink,我们希望运行的工作,由名为linktest的外部发起人触发,并且应该调用link-ea桥。 创建作业后,如果打开它,你将看到名称下的 ID。我们还需要那个ID。

我们要做的最后一件事就是为我们的外部适配器在本地建立一个Postgres数据库。如果你不知道如何做到这一点, 可以查阅Chainlink节点教程中的相关解释。

现在,我们可以创建实际的外部启动器。这只是一个简单的WebSocket服务器,你可以在任何编程语言中构建它, 但我会在Go中构建它,因为我真的很喜欢该语言。

首先,创建一个名为”external-initiator”的项目,并在项目根源中定义一个.env文件。现在,我们需要将 保存的值添加到改文件中:

1
2
3
4
5
6
7
EI_DATABASEURL=<external initiator postgres db url>
EI_CHAINLINKURL=localhost:6688
EI_IC_ACCESSKEY=<ACCESSKEY saved above>
EI_IC_SECRET=<SECRET saved above>
EI_CI_ACCESSKEY=<OUTGOINGTOKEN saved above>
EI_CI_SECRET=<OUTGOINGSECRET saved above>
JOB_ID=<Chainlink Job ID>

现在让我们来看看WebSocket客户端的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package mainimport ("encoding/json""log""os""github.com/gorilla/websocket"
)type WebSocket struct {Endpoint string
}type wsConn struct {connection *websocket.Connopen       bool
}func (ws WebSocket) Connect() wsConn {c, _, err := websocket.DefaultDialer.Dial(ws.Endpoint, nil)if err != nil {log.Fatal("Error dialing: ", err)}con := wsConn{connection: c,open:       true,}return con
}func (con wsConn) Subscribe(message string) {defer con.connection.Close()interrupt := make(chan os.Signal, 1)done := make(chan struct{})err := con.connection.WriteMessage(websocket.TextMessage, []byte(message))if err != nil {con.open = falselog.Fatal("Error subscibing to tx: ", err)}go func() {defer close(done)for {_, message, err := con.connection.ReadMessage()if err != nil {log.Println("Read error: ", err)}var txRes TxResultjson.Unmarshal([]byte(message), &txRes)var requesterAddr, event stringtxRes.convert(&requesterAddr, &event)if event == "RequestQuote" {startJob(requesterAddr)}}}()for {select {case <-done:returncase <-interrupt:log.Println("Interrupting")err := con.connection.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))con.open = falseif err != nil {log.Println("Close error:", err)return}return}}
}

这为外部发起人执行了大部分工作。还有其他一些文件,所以你应该看看仓库代码,以建立整体概念。

在这里,我们有一个WebSocket结构,它保存访问端接点,还有一个wsConn结构,代表连接。

我们在WebSocket上定义了一个Connect方法,其作用是建立一个连接。

我们在wsConn上定义了subscribe方法,用来订阅交易事件。当它记录到一个事件时,会获取到请求者的地址并 检查事件类型是否为RequestQuote。我们只需要这种类型的事件。然后,它调用startJob方法,这将触发Chainlink 预言机的工作。

现在我们有了一个功能正常的区块链,并且正顺利地将预言机连接到它。伟大的工作!让我们继续!

5、创建Chainlink外部适配器

外部适配器是能够用我们的预言机调用任何外部API 的关键。我们将在 JavaScript 中构建适配器, 因为一方面,这几乎是标准方法(尽管你可以同样轻松地使用 Go 或 Python)。另一方面,以后我们将 希望能够签署和广播交易到我们的区块链,Cosmos可以为我们自动生成所需的JavaScript代码。

外部适配器是Chainlink如何实现自定义计算和专业 API 的简单集成。外部适配器是Chainlink节点的 核心通过其API与简单的JSON规范进行通信的服务。 – Chainlink文档

首先创建一个文件夹link-ea并执行npm init。我们将使用一些包,因此让我们安装:

  • @chainlink/external-adapter:用于创建外部启动器的辅助包。
  • @cosmjs/proto-signing和@cosmjs/stargate:这两个将帮助我们与Cosmos区块链互动。
  • express和dotenv:这两个包和layda gaga一样出名。他们将帮助处理网络和环境变量。

还记得我告诉过你保存第一次运行区块链时生成的地址的助记词吗?现在我们需要其中之一。创建一个.env文件, 并复制MNEMONIC和ORACLE_ADDRESS。如果你没有保存它,只需使用starport serve --reset-once生成新的帐户。

现在是时候生成与区块链交互的代码了。在区块链文件夹中运行以下命令:

1
starport serve --rebuild-proto-once

在此之后,你应该会看到./vue/src/store路径上名为generated的文件夹。这包含生成的代码。我们只需要 其中一些文件,也必须做一些轻微的修改,以便能够在我们的应用程序中正常工作。完整代码可以查看这里

一旦我们有了这个,就可以设置签署和广播交易的API:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const {DirectSecp256k1HdWallet} = require('@cosmjs/proto-signing')
const {assertIsBroadcastTxSuccess} = require('@cosmjs/stargate')const {MsgCreateQuote} = require('../cosmos/tx')
const { txClient } = require('../cosmos/client')require('dotenv').config()class LinkAPI {constructor() {this.main = {//Create, sign and broadcast a quote txsignAndBroadcast: async (oracle, requester, quote) => {const wallet = await DirectSecp256k1HdWallet.fromMnemonic(process.env.MNEMONIC);const client = await txClient(wallet)const msg = MsgCreateQuote.fromJSON({creator: oracle,requester: requester,oracle: oracle,text: quote})const msgAny = client.msgCreateQuote(msg)const result = await client.signAndBroadcast([msgAny])assertIsBroadcastTxSuccess(result)console.log("Result: ", result)}}}
}
module.exports = LinkAPI

在上面,我们需要一些东西:

  • DirectSecp256k1HdWallet将利用助记词生成一个钱包
  • assertIsBroadcastTxSuccess将帮助我们验证已签署和广播的交易。
  • MsgCreateQuote是为我们生成的一个对象。它提供了创建和编码自定义事务消息的接口和方法。
  • txClient将用于签署和广播交易。

我们创建一个具有具有singAndBroadcast方法和main属性的API类。我们的 API 目前仅包含此功能, 但此设计可方便将来更新它。

signAndBroadcast方法包括预言机地址、请求报价的帐户地址和报价文本。它利用我们的助记词 (存储在文件中)创建一个钱包,并使用该钱包创建交易客户端(txClient)。然后,我们使用 我们之前引入的MsgCreateQuote对象的fromJSON方法,并传入到txClient创建消息的方法。 之后我们调用signAndBroadcast广播消息,并用assertIsBroadcastTxSuccess来检查一切是否顺利。

除此之外,我们有两个重要的文件(我不会在这里粘贴他们的代码)。一个被称为index.js,它定义了 一个createRequest函数,将验证来自我们的外部发起人的API请求的主体,并生成第三方API请求。

另一个是app.js,它负责启动我们的服务器然后调用createRequest。

6、把一切放在一起

我们基本完成了!现在是时候看看是否做的每件事都是正确的。让我们逐一启动所有的流程:

  • chainlink node start:运行链链接节点。
  • starport serve:运行宇宙区块链。
  • 在外部启动器文件夹中运行go build,然后运行external-initiator
  • node app.js启动外部适配器。

现在向预言机体提交报价请求:

1
2
3
linktestd tx linktest request-quote \cosmos1g7gw9jet6czu2m854v0ce3n3us8g8wyjkmdm3n \--from alice

用你自己的预言机地址替换cosmos1g...行,并从任何你喜欢的帐户发送。在这里,我使用默认情况下 创建的帐户之一作为请求者,另一个用作预言机。

现在,您应该观察每个终端窗口中的日志,看到各自流程正在开展的工作。

当一切都完成后,你可以使用linktest q linktest list-quote查询报价。你应该看到你的预言机发布 在链上的第一个随机报价。


原文链接:Connect a Chainlink Oracle to a Cosmos Blockchain

Chainlink对接Cosmos区块链相关推荐

  1. tron区块链php对接,Tron区块链技术 - Tron智能合约概述

    Tron区块链技术:多年来,  以太坊  一直是分散世界中开发智能合约的主流平台之一.然而,最近TRON作为一个准备面对以太坊的竞争平台在分散网络中崛起. TRON区块链技术是什么? Tron区块链是 ...

  2. 区块链关键技术研究进展

    摘要 区块链是一种由多方共同维护,使用密码学保证传输和访问安全,能够实现数据一致存储.难以篡改.防止抵赖的记账技术,也称为分布式账本技术.近年来,区块链技术的发展对社会产生了重要的影响.本文介绍近年来 ...

  3. 链改价值节点,构建区块链命运共同体

    区块链是信息革命的拐点,区块链技术的应用使信息时代的内涵从简单的信息复制.信息分享的时代迈入价值转移的时代,因此区块链实际上构建了一种新的网络,即价值互联网. 为了创造用户价值,推进区块链产业发展.标 ...

  4. 君子签亮相2021中国互联网峰会,区块链电子签约赋能26家机构现场签约

    7月13-15日,2021(第二十届)中国互联网大会,以全新主题"新阶段.新格局--互联网引领数字经济新发展"在北京国家会议中心隆重举办. 易保全受邀出席"互联网纠纷解决 ...

  5. “区块链技术创新要植根市场”

    2020年,金融科技从战略走向落地. 众所周知,2019年,央行正式发布金融科技三年发展规划,这是我国金融监管机构首次对金融科技进行系统化的归纳与论述,是金融科技发展进程中的里程碑. 时间过半,金融科 ...

  6. 阿里云基于区块链服务构建企业业务系统实践总结

    笔者注:本文是在2018年8月19日由InfoQ主办的BCCon全球区块链生态技术大会的演讲内容基础上整理而成,从技术上对阿里云区块链服务解决企业落地问题的思路以及设计理念进行了解读. 大家好!很高兴 ...

  7. 区块链社区先导者Bitwork正式宣布落户香港

    点击上方"蓝色字"可关注我们! 编辑:铅笔盒 2018年,区块链技术和概念在全球各个领域得到快速发展和普及,众多区块链企业及爱好者如雨后春笋般涌现出来的同时,优质的区块链项目不能得 ...

  8. 上千家企业涌入蚂蚁开放联盟链:在区块链上抢先吃红利螃蟹

    近日,蚂蚁区块链的"开放联盟链"在云端开放工具与商家营销工具两大场景开始发力:区块链创业公司"纯白矩阵"用1个月时间,在开放联盟链上开发了ChainIDE全套的 ...

  9. 区块链+:颠覆互联网+模式不是事!

    导语 :区块链+模式,是对互联网+模式的颠覆.区块链将大大提高人类社会经济活动的质量.速度和规模,加速文明的演进.如果说"互联网+传统行业"模式的结果是催生一个垄断的.中心化管理的 ...

最新文章

  1. 类型数据合并去重 mysql_MySQL基础知识 数据类型和数据表管理
  2. JDBC修改数据库(Object类的应用)
  3. (零)音视频技术基础知识,现实项目
  4. 机器学习(十)——因子分析
  5. PHP Module
  6. kali linux工具pyrit,在Kali Linux上安装cuda、pyritcuda以及optimus -电脑资料
  7. 网络安全未来发展趋势怎么样,学习难度大吗?
  8. 对360搜索引擎的评价
  9. scanf函数的读取
  10. 算法竞赛入门【码蹄集新手村600题】(MT1101-1150)
  11. Python实时获取steam游戏数据
  12. HTML基础--标签VSCode常用快捷方式和插件
  13. 水产品进口手续及报关清关注意事项2021-08-27
  14. Java后台生成多个Excel并用Zip打包后(可以将excel文件放置到不同的目录)下载
  15. 计算机近几年自考本科题,近几年自考管理系统中计算机硬应用题汇总.doc
  16. Flask项目能打包为单个exe文件运行?掌握原理后居然如此简单!
  17. 《编程之美》一摞烙饼问题详解与纠错
  18. BTC World直播间冬季训练营空投福利!听课就送2000币
  19. 软件工程导论期末复习整理
  20. maven学习--mavn安装说明和简单配置

热门文章

  1. tinyhttp web服务器设计及完整代码
  2. pink-移动web开发之流式布局
  3. tcpdump+Remote Virtual Interface(RVI)+wireShark进行流量分析
  4. 李明顺:六度理论是谎言 Web2.0非新商业模式
  5. 计算机毕业设计(附源码)python综合售楼系统
  6. 江苏大学2020计算机考研,江苏大学2020年硕士研究生复试时间及主要安排
  7. 致远推出全分销A6+,走协同OA差异化竞争路
  8. Esri和AfroChampions建立合作关系以在非洲推广地理信息系统
  9. 视频教程-Windows版YOLOv4目标检测实战:训练自己的数据集-计算机视觉
  10. CDM(码分多路复用技术)总结