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 每月下载量
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能够实现所有这些,同时在相同的时间提升开发者体验。
项目目标
- 使开发者能够使用HDF一次性编写他们的链外逻辑,从而创建自己的无头dApp,从而针对所有平台(桌面、网络、移动)。
- 为开发者提供从Ergo dApp规范到无头dApp的简单体验,并具有更高的保证和直接的实现路径。
- 将dApp的链外逻辑与任何前端逻辑分离,从而无论应用程序或前端尝试整合你的无头dApp时都允许其可重用性。
- 提供易于使用的工具,让前端实现者可以轻松访问dApp协议的当前状态,而无需了解其工作原理。
- 通过使用指定所需输入UTXOs的
BoxSpec
的新颖设计模式,抽象化定义和获取你的无头dApp输入UTXOs的概念。 - 使脚本、(套利)机器人和其他软件能够轻松地构建在多个使用HDF构建的无头dApp之上,从而提供标准化的接口和一定的可组合性。
理解Ergo无头dApp框架
在开始使用HDF之前,有许多术语和概念是重要的。HDF的总体设计基于EIP-6:Ergo智能合约协议规范格式。
这意味着在最高层面上,你的dApp被定义为智能合约协议。如果你的dApp只有一个阶段,则它被定义为“单阶段智能合约协议”。如果你的dApp有多个阶段,则它是一个“多阶段智能合约协议”。HDF支持构建单阶段和多阶段协议dApp。
每个阶段可以被视为协议中的一个状态,其中UTXO在特定时间点处于Ergs、代币和(寄存器中的)数据的某个状态。可能有一个UTXO在整个协议中从一个阶段移动到下一个阶段,多个UTXO并行通过所有阶段,或者各种UTXO异步通过某些子集阶段。
无论你特定的智能合约协议的设计/复杂性如何,每个阶段都需要“动作”。动作是状态转换(事务逻辑),它允许
- Ergs/代币/数据进入协议(即引导动作)
- Ergs/代币/数据从协议的一个阶段移动到另一个阶段(或退出协议)。
- Ergs/代币/数据离开协议。
这些动作中的每一个在你的无头dApp的上下文中都由两个关键部分组成
- 获取输入(UTXOs/用户输入/来自外部世界的其他数据)
- 创建带有状态转换结果的输出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
此模块公开了两个特质
WrappedBox
SpecifiedBox
ExplorerFindable
所有ExplorerFindable
结构体也都是SpecifiedBox
,而所有SpecifiedBox
也都是WrappedBox
。在您的离线代码中,您将通过实现SpecifiedBox
来定义所有动作的输入UTXO,同时自动推导出WrappedBox
和ExplorerFindable
,而无需额外工作。
WrappedBox
提供了与ErgoBox
交互的简化接口。另一方面,SpecifiedBox
指定给定的WrappedBox
也通过box_spec()
方法实现了BoxSpec
。最后,ExplorerFindable
为从Ergo Explorer API实例中查找匹配BoxSpec
的盒子提供了接口。
Specified Boxes
此模块公开了实现SpecifiedBox/
WrappedBox/
ExplorerFindable
特质的泛型“指定盒子”结构体。这些盒子可以用作离线协议代码中动作的输入,同时使前端开发者能够轻松访问链上数据,例如Oracle Pool数据。
当前实现的指定盒子
- ErgsBox
- ErgUsdOraclePoolBox
- AdaUsdOraclePoolBox
ErgsBox
用于获取包含Ergs的输入,这些输入可用于您的智能合约协议动作。
ErgUsdOraclePoolBox
和AdaUsdOraclePoolBox
为无头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提供基本接口。这些通常用于创建包含用户的更改或支付交易费用的输出。
示例输出构建器
- ChangeBox
- TokensChangeBox
- 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公开了三个过程宏,使开发者的生活更加简单。
- WrapBox
- SpecBox
- WASMBox
WrapBox
简单地实现了 WrappedBox
特性,SpecBox
实现了一个自定义的 new()
方法,该方法使用您的 BoxSpec
并为您实现 ExplorerFindable
特性,而 WASMBox
实现了使您的结构体支持WASM的两个基本方法(w_new()
和 w_box_struct()
)。
入门
创建《数学赏金无头dApp》教程系列,旨在指导您使用Ergo无头dApp框架。您将从项目创建开始,逐步学习如何开发自己的无头dApp,直到实现基于命令行的接口。
目前可用的部分
文档
要阅读HDF的文档,请运行以下命令
cargo doc --open
依赖项
~16MB
~303K SLoC