如何在 Gravity 协议中添加新的区块链

如何在 Gravity 协议中添加新的区块链

本文是有关协议和网络技术方面的 Gravity 文档的一部分,它提供了一个基于示例的全面的概述。本文以 Ethereum 和 BSC 集成为例,演示了开发人员在将新的区块链集成到 Gravity 跨链网络中时可能遇到的情况。

写扩展程序

为了通过增加对新区块链的支持来扩展 Gravity 协议,在 Gravity-Tech / gravity-core 和本文中提到的其他一些 Github 存储库中将进行一系列提交是被支持和鼓励的。这些源修改可以分为四个部分:

1. Gravity 分类帐节点逻辑(适配器)

2. Gravity Oracle 逻辑

3. Gravity 核心合约(Gravity-Tech / gravity-core / contracts)

4. Gravity 部署器(Gravity-Tech / gateway-deployer)

强烈建议您在实施解决方案时在指南中提到的特定存储库中打开拉取请求,这可以尽量减少对现有代码库的重写。如果您的目标是在新的集成链之上支持应用层逻辑,则需要对 Gravity-Tech / gateway 进行一些更改。逻辑部分还包括编写适当的 USER-SC (用户智能合约)。

SuSy 是第一个基于 Gravity 构建的 alpha 产品,它是跨链网关的协议和接口。当前,它以 Waves 为起点,以 Binance Smart Chain 为终点。SuSy 主网 Alpha 位于 susy.gravity.tech 上,并提供一个前端接口,该接口允许用户将 USDN 令牌从 Waves 交换到 BSC 中。BSC 上的 USDN 具有与以太坊上 USDN 相同的功能,包括自动抵押,弹性供应以及自动在所有持有人之间分配的抵押奖励。

SuSy 协议

SuSy 协议基于对 oracle 的信任,oracle 是将信息从一个区块链传输到另一个区块链的中介。从技术的角度来看,当将 oracle 实现为 Gravity 协议所做的不信任的分散式系统时,基于它的跨链网关将继承不信任。通过 Gravity oracle 协议实现的 SuSy 协议的另一个功能是存在有用的高级抽象和服务。

此外,要进行令牌从一个区块链到另一个区块链的跨链交换,除了相应区块链网络的本机原生令牌之外,不需要其他令牌。

以下是 SuSy 跨链传输算法的说明。它显示了令牌从起源链到目的地链的转移,在令牌中它将作为 swT (包装)令牌发行并发送到目标链中的接收者 R.

如何在 Gravity 协议中添加新的区块链

用户(S)通过向其转移 T 令牌的数量(A)并在 DESTINATION-CHAIN 中指定收件人的公共地址来与 LU-PORT 智能合约进行交互。网关智能合约自动创建唯一的 SWAP-ID 并设置注册状态。LU-PORT 智能合约冻结了收到的资金。

有关此事件的信息由提取器 Extractors (Gravity 网络的服务)处理,这些服务处理接收到的数据并将其传达给 Gravity。Oracle 从 Gravity 框架将有关新 SWAP-ID 和交换方向的哈希数据移动到验证合约(NEBULA-SC),在其中验证 Gravity 网络验证程序的签名和所传输上下文的合法性。

验证后,将调用 SEND-DATA-TX 事务,其中包含一组数据以及用于向接收方(R)发行和发送 swT 令牌的指令。

同样,有关此事件的所有数据都由 Gravity 网络 oracle 处理,并且,如果成功执行,将设置“已处理”状态。在达到一定数量的分叉可能性最小的块之后,可能需要设置最终状态。

相反,将 swT 令牌从 DESTINATION CHAIN 转移到 ORIGIN CHAIN 并解锁 LU PORT 合约上的 T,过程与上相似。唯一的区别在于最终交易,也就是说,IB PORT 上 swT 令牌的刻录和 LU PORT 上的 T 令牌的解锁是相反的。

关于 SuSy dApp 在其他区块链上的扩展,USER-SC 充当 IB (Issue-Burn)和 LU (Lock-Unlock)端口的角色。USER-SC 方法应由 NEBULA-SC 调用。因此,为了使该协议之上的应用程序正常运行,需要:

1. 在 Gravity-Tech / gravity-core / contracts 内提供新的 NEBULA-SC 和 SYSTEM-SC (重力合同)。

2. 创建一个与您的自定义 NEBULA-SC 一致的自定义 USER-SC。

关于扩展 Gravity Core 的建议

为了确保与新链的兼容性,需要一组单独的智能合约。更重要的是,有两种类型的合约:Gravity core 使用的合约和特定于应用程序的合约(例如 SuSy)。

在此处可以找到以太坊和海浪的 IB 端口和 LU 端口的示例:

· https://github.com/Gravity-Tech/gateway/blob/main/contracts/ethereum/IBPort.sol

· https://github.com/Gravity-Tech/gateway/blob/main/contracts/waves/luport.ride

应该在新的区块链网络中实现两个具有以下功能的新智能合约:

1. 智能合约应使用以下参数支持对 attachEventData 函数的外部调用:令牌 ID (可选,因为不同的令牌将具有自己的网关),金额,接收者

2. 5 个管理员帐户中只有一个可以调用此方法。

3. 在 attachEventData 之后,Receiver 必须接收包装的令牌

4. 包装的令牌的持有者应该能够将令牌发送到网关地址,这将触发 API (RPC)调用。

以上 1-4 的陈述,必须实现开放和公共的 API。

创建合同后,需要将它们编译为字节码。编译后的字节码文件应放在“ / abi”目录中。考虑检查 Gravity-Tech / gateway 存储库中的“ contracts”目录,以查看网关合同的源代码示例。

为了添加任何新链的实现,首先应由 Gravity Network 本身进行支持。完成智能合约后,有必要在 Gravity Core 存储库中实现核心适配器。Gravity Core 应用程序的体系结构是模块化的,没有任何紧密的耦合,这保证了扩展单独组件的简便性。原则上,使用任何编程语言或库都是可以接受的,但是通常最好通过提供所需方法的实现来扩展现有的 Go 源代码,而不是从头开始重写。

若要更清楚地了解对 Gravity Core 进行的必要更改,请查看此“ BSC support”对 Gravity Ledger Node 扩展的请求。在本文的后面,我们将说明上面的 pull 请求中描述的更改的每个部分。

要记住的要点:

· 请注意特定链的 BlocksInterval 参数(正确的网络“pusation”所需)。

· 包括适配器的实现 IBlockchainAdaptor 接口,它是每个特定链中最具描述性的部分。

· 尝试启动节点并在 customnet 中部署合约,以测试新编写的适配器。测试后,创建对 Gravity-Tech / gravity-core 的拉取请求。

基于 BSC 和以太坊集成的所需更改概述

cmd / gravity / commands / ledger.go

在 createApp ()函数中,应提供用于实例化新适配器的构造函数:

如何在 Gravity 协议中添加新的区块链

可以考虑将适配器实现存储在 common / adaptors / [chain_name] .go 中。

Common/adaptors/[chain_name].go

与特定链通信相关的重要部分是 IBlockchainAdaptor 接口:

如何在 Gravity 协议中添加新的区块链

让我们回顾一下以太坊适配器如何满足接口的要求。

首先,声明特定于区块链的类型和结构:

如何在 Gravity 协议中添加新的区块链

以太坊实现包含:

  1. WithEthereumGravityContract ()函数可基于 GravityContractAddress 进行实例化。它在前面提到的 createApp 函数中调用。

  2. EthAdapterWithGhClient ()函数,用于启动 Gravity Oracle:

如何在 Gravity 协议中添加新的区块链

还必须实现一个构造函数,例如下面的 NewEthereumAdaptor ():

如何在 Gravity 协议中添加新的区块链

下面来探索 GetHeight ()和 Sign ()方法。第一个检索区块链高度,第二个实现字节签名:

如何在 Gravity 协议中添加新的区块链

WaitTx 必须阻塞线程。一个简单的选择模式可以处理需要等待交易的情况。注意:这里使用 queryTicker 来防止 goroutine 泄漏,因此 3 秒超时是硬编码的:

如何在 Gravity 协议中添加新的区块链

PubKey ()解析适配器的公钥。ValueType ()使用相应的 ABI 实例化 Nebula-SC。接下来,它调用 DataType ()来解析星云使用的值类型(Gravity 支持 Byte,Int 和 String 类型)。

如何在 Gravity 协议中添加新的区块链

该 AddPulse ()实现包含许多技术细节。最重要的是,此方法执行:

1. 检查 Nebula 脉冲计数和 BFT 值是否一直保持为智能合约状态。如果任何值都不存在,则该方法返回一个空字符串。

2. 检查是否有正确数量的验证器(> = BFT 值)已对消息签名。

SendValueToSubs ()方法负责将值发送到 Nebula 的订阅者。Nebula 与订阅者具有一对多关系。

如何在 Gravity 协议中添加新的区块链

SetOraclesToNebula ()更新 Nebula 的 oracle。签名和公钥验证是强制性的:

如何在 Gravity 协议中添加新的区块链

SendConsulsToGravityContract ()类似,但是它用于 consuls 和 Gravity 合约的上下文中。

如何在 Gravity 协议中添加新的区块链

SignConsuls ()和 SignOracles ()负责对更新的 consuls/oracle 进行签名。两种方法实际上使用相同的算法。

如何在 Gravity 协议中添加新的区块链

LastPulseId ()解析 Nebula 的最后一个脉冲的 ID,这是 Nebula oracle 执行的最后一个动作的 ID。该方法对 Gravity Oracle 至关重要,因为它通常用于比较当前脉冲和先前脉冲的迭代器中。

LastRound ()确定 Gravity 网络中的最新动作。Round 本质上是区块链高度的特定指标,其中 Gravity 网络通过 Oracle/Consuls 更新,值更新或脉冲发送来使状态发生变化。

RoundExist ()验证是否存在特定回合。

如何在 Gravity 协议中添加新的区块链

common / account / chain.go

在此文件中,应实例化一个常量。在其他地方,当提及现有常量时,也应添加此新常量:

如何在 Gravity 协议中添加新的区块链

Common/account/nebula.go

该模块负责 Nebula 逻辑。

如何在 Gravity 协议中添加新的区块链

common / account / pubkey.go

在此指定与帐户地址实例化有关的链行为。

如何在 Gravity 协议中添加新的区块链

common / storage / consuls.go

此模块负责解析 consul 密钥。

如何在 Gravity 协议中添加新的区块链

Oracle 组件

oracle / node / node.go

Gravity Oracle 的关键部分。node.go 以及整个 oracle / node 模块描述了现有的实现并设置了 oracle 约束。

关于 WAVES

Waves(波币) 是始于 2016 年的技术派公链劲旅,Neutrino 协议,Gravity 协议和 Waves Enterprise 是 Waves 品牌旗下三驾马车,覆盖了 DeFi,跨链与企业应用等热门领域。

Waves 是一个面向 Web3.0 应用及分布解决方案的开放区块链协议和开发者工具集。Waves 的愿景是通过提升 IT 系统的安全性,可靠性和速度,来支持开发者建立自己的链上应用,促进区块链产业的大规模落地。

官网: https://waves.tech/

白皮书: https://docs.waves.tech/en/

公众号: Waves 中文社区

微博: Waves 中文社区

QQ 群: 664112321

如何在 Gravity 协议中添加新的区块链

WAVES 微信群

如何在 Gravity 协议中添加新的区块链

如何在 Gravity 协议中添加新的区块链

『声明:本内容仅供广大加密爱好者科普学习和交流,不构成投资建议,请理性看待,提高风险意识。文章版权和最终解释权归 Waves 中文社区所有。我们尊重版权,如有疑问请第一时间联系我们,非常感谢。』