掌握最新波卡开发技能:从 SDK 到 Core,敏捷核心时间完全指南

在这里插入图片描述

作者:agile badery,Web3 Foundation 技术教育者

原文:https://hackmd.io/@Iu0IylwRSxWo5qCZHN4fPw/template_to_core_rococo#

编译:OneBlock+

这篇文章是一个关于波卡敏捷核心时间(Agile Coretime)的简洁教程,将涵盖以下内容:

Polkadot SDK 概述(具体而言是其 templates)
Coretime 的概述,以及在 Core 上部署的含义
从 template 到 Core 的开发流程是怎样的
如何以及在哪里获取一个 Core
配置、编译和使用 template
在 Core 上部署

请注意:目前只能在以下网络上使用敏捷核心时间:

Kusama - 金丝雀网络

Rococo - 测试网

在这里查看更多在 Polkadot
上开发的信息:https://wiki.polkadot.network/docs/build-network-overview

在这里插入图片描述

本教程将使用 Rococo 进行测试。

建议尽快开始同步你的 Rococo 数据库,使用 fast-unsafe 选项。你的平行链将需要运行一个 collator,它将数据从你的平行链传递到中继链进行验证。collator 实际上就像你的平行链的验证器,只不过更像是生成块并将状态更改发送到中继链的角色。

同步 Rococo 可能需要一些时间(12 小时-1 天),这取决于互联网连接速度,除非你能获得数据库的快照。然而,在你必须同步节点之前,你还可以做一些设置。

Polkadot SDK 简介

乍一看,Polkadot SDK 可能会让人感到非常疑惑,某种程度上确实如此,因为它将许多技术整合到了一个地方。Polkadot SDK 曾经是三个存储库的总称:

  • Polkadot:一度包括客户端实现和 runtime,直到 runtime 被移动到 Polkadot Fellows 组织为止。
  • Substrate:用于构建区块链的基础核心原语和库(不仅仅是 Polkadot 的区块链),Polkadot 的大部分都是用 Substrate 构建的。
  • Cumulus:一组库和工具,专门用于连接区块链到Polkadot,称为平行链。

在这里插入图片描述

根据我们的目的,我们实际上只对几个特定部分感兴趣:

  • FRAME:一个使 Substrate 易于使用的框架。使用 FRAME 和 Substrate,我们可以创建一个 runtime,该 runtime 由称为 pallets 的 runtime 模块组成,然后我们可以使用自定义业务逻辑构建分布式账本。
  • 模板在 templates/ 内。

要深入了解 monorepo,建议查看 Polkadot SDK 文档,其中解释了所有内容:https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/index.html

使用这些工具,我们可以构建一个完全定制的区块链,然后将其部署到 Polkadot 上。

核心时间到底是什么!?

在解释敏捷核心时间之前,先介绍一点历史:

在 Polkadot 上,可以通过部署平行链来利用 Polkadot 网络的安全性。

然后,Polkadot 验证每个平行链的状态转换。这意味着 Polkadot 集体代表了许多区块链的状态。其他好处,比如互操作性,使这成为了一个吸引人的选择,想要构建 Layer1 区块链的人。

然而,为了参与,每个平行链都必须经过一个拍卖过程来获得一个插槽。这被证明对于想要真正开发构建的人来说是一个障碍。

平行链插槽也被证明是昂贵的,因为你实际上必须支付一定数量的区块空间来使用。大多数平行链选择拥有一个为期 2 年的插槽,这意味着在 2 年结束时,他们必须续订他们的插槽。

敏捷核心时间彻底改变了这种范式。敏捷核心时间中的核心可以被认为是一种对曾经是平行链插槽的抽象。核心允许将代码上传并运行到 Polkadot 超级计算机上。这种范式完全改变了我们对运行“L1”区块链的方式,因为它实际上就像上传代码和创世块到中继链,几乎类似于智能合约。

在这里插入图片描述

以下是来自 Polkadot Wiki 的摘录,更详细地解释了这一点:

敏捷核心时间使 Polkadot 网络资源的利用更加高效,并为建设者提供了经济上的灵活性,将 Polkadot
泛化到了白皮书中最初提出和设想的范围之外。

在 Polkadot 1.0 中,要使平行链由 Polkadot
保护,唯一的方式就是通过拍卖租用,这可以保证平行链的区块验证持续两年。这涉及锁定大量的
DOT,导致了小型和中型区块链项目的准入壁垒较高。平行链以 12
秒的固定间隔生成块,与网络活动无关。这导致资源分配效率低下和错误的经济激励,即在轻负载下生成几乎为空的块,并且在超过块限制时无法容纳更重的流量。敏捷核心时间解决了所有这些缺点。

——敏捷核心时间介绍,Polkadot Wiki

你也可能会在核心时间的上下文中看到“task”一词。理论上,task 不必是一个区块链/平行链。只要它能够满足 Polkadot 协议的要求,那么它就可以是一个 task。

从 SDK 到 Core

从 Polkadot SDK 到 Core 的开发流程实际上非常简单:

  1. 保留 ParaId,在这里你将上传你的 runtime 和创世状态。

  2. 将 runtime(用 Rust 编写)编译为 WebAssembly blob,从而定义了你的状态如何从一个状态过渡到下一个状态。这个 runtime 是使用 Polkadot SDK 创建的。

  3. 确保你的链规范是可行的,并且准备好部署为一个实时的、可工作的平行链。

  4. 生成你的创世状态和 wasm。

  5. 获得一个 Core,很可能通过核心时间市场(https://wiki.polkadot.network/docs/learn-guides-coretime-marketplaces)。

  6. 将该核心分配给你的 ParaId。

  7. 确保为你的 task 至少保证有一个诚实的、同步的 collator

通过此过程结束时,你应该有一个完全同步且工作正常的区块链,该区块链由运行在其上的整体安全性(Kusama 或 Rococo)保护。

以下图表是此过程的可视化,尽管顺序可能略有不同(即开始之前应该保留一个 ParaId):

在这里插入图片描述

获取 ROC 并保留一个 ParaId

转到 Polkadot.js 以保留 ParaId。我们需要一个 ParaId 来上传我们的平行链的代码:

  1. 获取 Polkadot.js Web 扩展。

  2. 创建一个钱包,并用你的新地址通过 faucet 获得一些 ROC

  3. 确保你通过侧边栏上的选项卡选择 Rococo 作为你的网络

  4. 转到网络 > 平行链 > 平行线程(选项卡)

创建链和生成艺术品

我们现在可以继续真正开始我们的项目。一些重要的先决条件是:

安装 Rust 及其关联的工具。

安装夜间版本。

在你的处置中具有所有命令行、git 和其他常见开发工具。

如果上述列表听起来令人困惑,请确保访问 Wiki 的 Build 部分,其中我们需要克隆 Polkadot SDK。本指南使用发布的 polkadot-v1.10.0 版本,我们可以通过标签轻松地克隆它:

git clone git@github.com:paritytech/polkadot-sdk.git --branch polkadot-v1.10.0 --single-branch

现在,导航到 polkadot-sdk/templates/parachain。在你选择的代码编辑器中打开此文件夹,然后你就可以开始开发和编译你的链了。

使用平行链 Template

本教程不会详细介绍模板的具体内容,也不会详细介绍 FRAME 和 Subtrate 的具体内容。你需要知道的只有以下内容:

runtime/ - runtime 和业务逻辑。这是你的所有pallets(runtime 模块)的配置。runtime 是作为WebAssembly blob 上传到核心的。

node/ - 节点实现,负责网络等。创世配置(chain_spec.rs)也位于此处。

pallets/template - 一个方便的、本地可用的 template pallet,我们可以修改并包含在我们的 runtime 中。

Pallets 本质上只是 Rust crates,作为依赖项导入,如 runtime/Cargo.toml 中所见

当我们编译我们的 template 时,我们可以提取 runtime 代码作为 .wasm blob,这是我们核心的关键工件之一。

为了本例,我们不会介绍如何添加或修改任何 pallets。不过,这是你在 Rococo 上部署你的平行链后的下一步!

使平行链准备就绪

未来需要注意的是:配置链规范的方式可能会改变,请关注此 PR。

在生成我们的平行链代码之前,我们需要对 node/src/chain_spec.rs 中的我们的节点进行一些准备。具体来说,有几个主要因素:

  1. 确保 relay_chain 设置为目标中继链(在我们的情况下是 rococo)

  2. 确保 para_id(位于 relay_chain 正下方)设置为你保留的 ParaId

  3. 确保我们的 ChainType 设置为 ChainType::Live

  4. 删除除了一个之外的所有 collator,即 Alice。为什么要这样做,请参阅 FAQ

  5. 还要在 testnet_genesis 中设置 para id

  6. 可以选择更改链的名称和 id(我的名称叫“SomeChain”,id 叫 “some_chain”)。默认 token 的票证符号为“SOME”。

如果你没有执行其中的一项操作,你的链可能无法生成块。随时复制以下配置,并使用它来确保一切就绪,以便进行 Rococo 部署。此函数应替换 node/src/chain_spec.rs 中的 local_testnet_config 函数:

⚠️警告:请确保你用之前保留的 ParaId 替换现在的!

pub fn local_testnet_config() -> ChainSpec {
// Give your base currency a unit name and decimal places
let mut properties = sc_chain_spec::Properties::new();
properties.insert(“tokenSymbol”.into(), “SOME”.into());
properties.insert(“tokenDecimals”.into(), (12).into());
properties.insert(“ss58Format”.into(), (42).into());

#[allow(deprecated)]
ChainSpec::builder(
    runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"),
    Extensions {
        relay_chain: "rococo".into(),
        // You MUST set this to the correct network!
        para_id: YOUR_PARA_ID_HERE,
    }
)
    .with_name("SomeChain")
    .with_id("some_chain")
    .with_chain_type(ChainType::Live)
    .with_genesis_config_patch(
        testnet_genesis(
            // initial collators.
            vec![
                (
                    get_account_id_from_seed::<sr25519::Public>("Alice"),
                    get_collator_keys_from_seed("Alice"),
                ),
            ],
            vec![
                get_account_id_from_seed::<sr25519::Public>("Alice"),
                get_account_id_from_seed::<sr25519::Public>("Bob"),
                get_account_id_from_seed::<sr25519::Public>("Charlie"),
                get_account_id_from_seed::<sr25519::Public>("Dave"),
                get_account_id_from_seed::<sr25519::Public>("Eve"),
                get_account_id_from_seed::<sr25519::Public>("Ferdie"),
                get_account_id_from_seed::<sr25519::Public>("Alice//stash"),
                get_account_id_from_seed::<sr25519::Public>("Bob//stash"),
                get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),
                get_account_id_from_seed::<sr25519::Public>("Dave//stash"),
                get_account_id_from_seed::<sr25519::Public>("Eve//stash"),
                get_account_id_from_seed::<sr25519::Public>("Ferdie//stash")
            ],
            get_account_id_from_seed::<sr25519::Public>("Alice"),
            (YOUR_PARA_ID_HERE).into()
        )
    )
    .with_protocol_id("template-local")
    .with_properties(properties)
    .build()

}
一旦就绪,你就可以编译你的平行链了。

生成 Runtime 和创世状态

请务必首先使用以下命令构建节点(假设你在 polkadot-sdk/templates/parachain 中):

cargo build -p parachain-template-node --release
…/…/target/release/parachain-template-node export-genesis-state genesis
…/…/target/release/parachain-template-node export-genesis-wasm genesis-wasm

开始同步 - 运行你的收集器

你现在应该开始同步你的收集器。请注意,你需要首先同步 Rococo——这可能需要一些时间(12小时到一天,取决于你的下载速度),所以最好尽快开始。为了避免存储中继链的完整状态,请确保使用适当的 pruning 标志运行:

…/…/target/release/parachain-template-node --collator \
–alice
–base-path
–force-authoring

–chain=rococo
–sync fast-unsafe
–blocks-pruning 256
–state-pruning 256

此命令实际上会同时启动两个节点:你的平行链的收集器节点以及嵌入式中继链节点,因此通过 – 在命令中进行了分离。

现在你应该可以看到你的中继链。

创建 Parathread

生成创世状态和创世状态-Wasm 后,你现在可以创建 Parathread 了。回到 PolkadotJS 中的网络 > 平行链 > 平行线程(选项卡),然后在右上角单击 + Parathread:

  1. 在 code 字段中上传 genesis-wasm

  2. 在 initial state 字段中上传 genesis 状态

支付存款,你就可以开始了!请记住,parathread 需要约 2 小时才能上线。

获得核心时间

理想情况下,在此步骤之前,你的节点应该与中继同步。

幸运的是,获得一个核心很容易,因为已经有了核心市场。访问 Polkadot Wiki 上的核心市场页面以了解更多信息,并购买一个核心:https://wiki.polkadot.network/docs/learn-guides-coretime-marketplaces

我们有两个选择:

  1. 批量:预付款以使用 Rococo 的验证来验证我们的平行链。

  2. 按需:为我们的块生产按需付款。

有了批量核心时间,我们可以将一个核心分配给我们的 ParaId,只要该核心有效,我们的平行链就会生成块并通过 Rococo 测试网进行最终确认。在我们必须更新核心之前,我们不应接触。

值得注意的是,你可以轻松地使用按需外部命令进行实验,然后稍后切换到批量核心时间模型。现在,让我们从按需核心时间开始,以使我们的第一个块开始。

按需核心时间

假设你的收集器已同步,你可以尝试使用按需外部命令创建块:

  1. 转到 PolkadotJS > Extrinsics

  2. 发布 onDemandAssignmentProvider.placeOrderAllowDeath 外部命令

  3. 将 max_amount 设置为至少 1000000000000,paraId 设置为你的 ParaId。

  4. 只要你的收集器正在运行,你应该会看到你的块高度从 0 增加到 1

批量核心时间:分配你的核心

如果一切正常运行,你现在可以选择为你的平行链分配批量核心时间以进行持续的块生成。对于我的分配,我将使用 RegionX 的 CoreHub,一个不错的 UI,用于购买和分配核心。

  1. 连接你的钱包(右上角的按钮)

  2. 单击左侧的 Purchase a Core

  3. 在右下角单击"Purchase Core"

  4. 转到 My Regions,并单击选择你的区域

  5. 单击右侧的 Assign

  6. 单击 Add Task,并输入你的 ParaId 以及你链的名称

  7. 选择你的任务,然后选择 Provisional Assignment

  8. 只要一切都同步,你的收集器正在运行,你应该看到块持续创建:

在这里插入图片描述

接下来做什么?

现在,你有了启动 Layer 1 区块链的能力,可能性是无限的:

创建平行链应用程序
在你的链上开发智能合约
参加联盟链中的 DeFi 生态系统
建立一个 NFT 市场

或者也有很多替代方案:

Tansii Dancebox:一种在您自己的运行时中利用 Polkadot 计算的更简单方法。
https://docs.tanssi.network/builders/tanssi-network/testnet/dancebox/

本教程不适合您?OpenZeppelin 的教程应该是最新的!
https://docs.openzeppelin.com/substrate-runtimes/1.0.0/

不管你选择什么,祝你好运,并且希望你通过敏捷核心时间做出一些有趣的东西!

  • 29
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值