#dapp #ergo #blockchain #smart-contracts

ergo-headless-dapp-framework

一个易于使用的框架,用于构建 Ergo 无头 dApps

13 个版本

0.1.13 2022 年 1 月 22 日
0.1.11 2021 年 2 月 17 日
0.1.9 2021 年 1 月 8 日
0.1.6 2020 年 12 月 31 日

#2176 in 神奇豆子

30 每月下载量

MIT 许可证

69KB
961

Ergo Headless dApp 框架

开发 Ergo 无头 dApps 的顶级 Rust 框架。Ergo HDF 为开发者提供了在任何区块链上第一个可移植的基于 UTXO 的无头 dApp 开发框架。

什么是无头 dApps?

无头 dApps 是一种全新的技术和商业模式,用于开发 dApps,它刚开始在更广泛的区块链领域站稳脚跟。简而言之,无头 dApps 是读取和参与链上智能合约协议的纯净和可移植的独立逻辑。

换句话说,无头 dApps 是一种软件,它通过一个简化的界面将复杂的链上协议暴露给链下世界,任何人都可以在其之上构建。关键在于,正如其名称所示,无头 dApps 没有在其之上构建的前端(因此称为“无头”)。

无头 dApps 提供的是整个去中心化生态系统的自由,可以建立在其之上。因为无头 dApps 默认是纯净和可移植的,所以它们可以编译到任何桌面操作系统、移动操作系统或浏览器。因为它们有一个简化的界面,所以可以轻松地将其集成到脚本和机器人中。因为它们是可组合的,所以可以在应用程序中使用,使得在不同协议之间进行套利变得简单,或者开发全新的用户体验,而无需了解每个支持的 无头 dApps 核心的工作方式。

无头dApp是未来,它能够让经验有限的新开发者在智能合约协议开发方面仍然能在dApp领域产生真正的影响。通过分离关注点,可以在无头dApp之上构建,而无需投入大量时间去理解使dApp成为可能的细节。

此外,无头dApp为全新的商业模式打开了生态系统。不再是智能合约协议创建者从协议的成功中吸走所有潜在利润/价值,无头dApp为前端开发者揭露了一条尚未开发的收入渠道。通过将潜在利润从仅限于协议创建者分散到每一个开发的前端,我们摆脱了现在流行的具有单个托管前端dApp的中心化效应。相反,我们可以激励由众多独立开发者/公司构建的强大生态系统,所有这些前端都可以从改善整体生态系统中获益。

无头dApp能够实现所有这些,同时在相同的时间提升开发者体验。

项目目标

  1. 使开发者能够使用HDF一次性编写他们的链外逻辑,从而创建自己的无头dApp,从而针对所有平台(桌面、网络、移动)。
  2. 为开发者提供从Ergo dApp规范到无头dApp的简单体验,并具有更高的保证和直接的实现路径。
  3. 将dApp的链外逻辑与任何前端逻辑分离,从而无论应用程序或前端尝试整合你的无头dApp时都允许其可重用性。
  4. 提供易于使用的工具,让前端实现者可以轻松访问dApp协议的当前状态,而无需了解其工作原理。
  5. 通过使用指定所需输入UTXOs的BoxSpec的新颖设计模式,抽象化定义和获取你的无头dApp输入UTXOs的概念。
  6. 使脚本、(套利)机器人和其他软件能够轻松地构建在多个使用HDF构建的无头dApp之上,从而提供标准化的接口和一定的可组合性。

理解Ergo无头dApp框架

在开始使用HDF之前,有许多术语和概念是重要的。HDF的总体设计基于EIP-6:Ergo智能合约协议规范格式

这意味着在最高层面上,你的dApp被定义为智能合约协议。如果你的dApp只有一个阶段,则它被定义为“单阶段智能合约协议”。如果你的dApp有多个阶段,则它是一个“多阶段智能合约协议”。HDF支持构建单阶段和多阶段协议dApp。

每个阶段可以被视为协议中的一个状态,其中UTXO在特定时间点处于Ergs、代币和(寄存器中的)数据的某个状态。可能有一个UTXO在整个协议中从一个阶段移动到下一个阶段,多个UTXO并行通过所有阶段,或者各种UTXO异步通过某些子集阶段。

无论你特定的智能合约协议的设计/复杂性如何,每个阶段都需要“动作”。动作是状态转换(事务逻辑),它允许

  1. Ergs/代币/数据进入协议(即引导动作)
  2. Ergs/代币/数据从协议的一个阶段移动到另一个阶段(或退出协议)。
  3. Ergs/代币/数据离开协议。

这些动作中的每一个在你的无头dApp的上下文中都由两个关键部分组成

  1. 获取输入(UTXOs/用户输入/来自外部世界的其他数据)
  2. 创建带有状态转换结果的输出UTXOs

重申以上内容,您的dApp可以是单阶段或多阶段智能合约协议。您的dApp协议中的每个阶段可能包含一个或多个动作。这些动作由您作为开发者通过指定给定动作所需的输入,并编码所需的状态转换逻辑来定义,以创建嵌入在新创建的UnsignedTx中的输出UTXO。

HDF为您提供了所需工具,以便您可以指定这些构建块,从零开始构建您的无头dApp。在下文部分,我们将进一步详细介绍HDF的构建方式和您如何从今天开始使用它。

Ergo无头dApp框架模块

Box Spec

此模块公开了BoxSpec结构体,允许您创建UTXO的规范。这用于定义协议动作所需的盒子。

/// A specification which specifies parameters of an `ErgoBox`.
/// This spec is used as a "source of truth" to both verify and find
/// `ErgoBox`es which match the spec. This is often used for defining
/// Stages in multi-stage smart contract protocols, but can also be used
/// to define input boxes for Actions.
/// All fields are wrapped in `Option`s to allow ignoring specifying
/// the field.
#[wasm_bindgen]
#[derive(Clone)]
pub struct BoxSpec {
    /// The address of the box
    address: Option<ErgoAddressString>,
    /// The allowed range of nanoErgs
    value_range: Option<Range<NanoErg>>,
    /// A sorted list of `Constant`s which define registers
    /// of an `ErgoBox`.
    /// First element is treated as R4, second as R5, and so on.
    registers: Vec<Option<Constant>>,
    /// A sorted list of `TokenSpec`s which define tokens
    /// of an `ErgoBox`.
    tokens: Vec<Option<TokenSpec>>,
    /// An optional predicate which allows for defining custom
    /// specification logic which gets processed when verifying
    /// the box.
    predicate: Option<fn(&ErgoBox) -> bool>,
}

一旦您构建了BoxSpec,您将拥有一些基本方法,这些方法简化了编写dApp离线代码的体验。

例如,verify_box允许您测试提供的ErgoBox是否与您使用BoxSpec创建的规范匹配。

pub fn verify_box(&self, ergo_box: &ErgoBox) -> Result<()> {

Box Traits

此模块公开了两个特质

  1. WrappedBox
  2. SpecifiedBox
  3. ExplorerFindable

所有ExplorerFindable结构体也都是SpecifiedBox,而所有SpecifiedBox也都是WrappedBox。在您的离线代码中,您将通过实现SpecifiedBox来定义所有动作的输入UTXO,同时自动推导出WrappedBoxExplorerFindable,而无需额外工作。

WrappedBox提供了与ErgoBox交互的简化接口。另一方面,SpecifiedBox指定给定的WrappedBox也通过box_spec()方法实现了BoxSpec。最后,ExplorerFindable为从Ergo Explorer API实例中查找匹配BoxSpec的盒子提供了接口。

Specified Boxes

此模块公开了实现SpecifiedBox/WrappedBox/ExplorerFindable特质的泛型“指定盒子”结构体。这些盒子可以用作离线协议代码中动作的输入,同时使前端开发者能够轻松访问链上数据,例如Oracle Pool数据。

当前实现的指定盒子

  1. ErgsBox
  2. ErgUsdOraclePoolBox
  3. AdaUsdOraclePoolBox

ErgsBox用于获取包含Ergs的输入,这些输入可用于您的智能合约协议动作。

ErgUsdOraclePoolBoxAdaUsdOraclePoolBox为无头dApp开发者和前端实现者提供了非常简化的接口,以利用两个当前运行的Oracle Pools中的数据。这两个指定盒子甚至可以被钱包/任何需要从Oracle Pool盒子中读取当前汇率的离线应用程序使用。

下面的代码块显示了如何在4行内从您首选的Ergo Explorer API实例中读取当前的Erg-USD Oracle Pool汇率

let url = ErgUsdOraclePoolBox::explorer_endpoint("https://api.ergoplatform.com/api").unwrap();
let response = get(&url).unwrap().text().unwrap();
let oracle_pool_box =
    ErgUsdOraclePoolBox::process_explorer_response(&response).unwrap()[0].clone();
println!(
    "Erg-USD Oracle Pool: {} nanoErgs per USD",
    oracle_pool_box.datapoint()
);

Output Builders

此模块公开了结构体,为创建动作中的常见输出UTXO提供基本接口。这些通常用于创建包含用户的更改或支付交易费用的输出。

示例输出构建器

  1. ChangeBox
  2. TokensChangeBox
  3. TxFeeBox

交易创建

此模块公开了一些基本函数,以便在您的操作中构建 UnsignedTransaction 时使您的生活更加轻松。

编码

此模块公开了与编码/解码/包装/解包值相关的许多有用函数,这些值可以从一种形式转换为另一种形式。

示例

pub fn erg_to_nano_erg(erg_amount: f64) -> u64;
pub fn nano_erg_to_erg(nanoerg_amount: u64) -> f64;
pub fn unwrap_long(c: &Constant) -> Result<i64>;
pub fn serialize_p2s_from_ergo_tree(ergo_tree: ErgoTree) -> P2SAddressString;

过程宏

此crate公开了三个过程宏,使开发者的生活更加简单。

  1. WrapBox
  2. SpecBox
  3. WASMBox

WrapBox 简单地实现了 WrappedBox 特性,SpecBox 实现了一个自定义的 new() 方法,该方法使用您的 BoxSpec 并为您实现 ExplorerFindable 特性,而 WASMBox 实现了使您的结构体支持WASM的两个基本方法(w_new()w_box_struct())。

入门

创建《数学赏金无头dApp》教程系列,旨在指导您使用Ergo无头dApp框架。您将从项目创建开始,逐步学习如何开发自己的无头dApp,直到实现基于命令行的接口。

目前可用的部分

  1. 数学赏金无头dApp - 编写您的第一个操作入门
  2. 数学赏金无头dApp - 完成无头dApp
  3. 数学赏金无头dApp - 编写用于创建赏金的CLI前端

文档

要阅读HDF的文档,请运行以下命令

cargo doc --open

依赖项

~16MB
~303K SLoC