为波卡上线做好准备 你需要了解这些

本文来自波卡百科(Polkadot Wiki),更新于 2020 年 3 月 5 日。
本文是这篇文章的最新版本:为 Polkadot 做好准备你所需要的一切。
Polkadot 是一个区块链协议,它有两个目标:为所有接入的平行链提供共享安全性,并允许所有接入的链使用 XCMP 进行互操作。随着 Parity 的 Substrate 和 Cumulus 等 PDK[2] 的出现,开发和启动新链所需的时间大大减少。以前开发一条链需要几年的时间,现在可能只需要几周甚至几天。
这份指南将带你了解想要使用 Polkadot 创建你的愿景,你现在能做的事儿。我们将解释平行链和智能合约之间的区别(以及为什么其中一个可能比另一个更适合你的应用程序)。还将列出现在可用的资源和即将发布的资源,以便你可以开始创建应用程序,并为参与今年晚些时候的 Polkadot 主网发布做准备。

我们目前在什么阶段

  • Polkadot 上线:2020 年初
  • 金丝雀测试网已上线:Kusama
  • 目前的测试网:Westend
  • Substrate: 2.0.0 版本
  • Cumulus:开发中,Demo 见 https://github.com/paritytech/cumulus[3]
  • ink!:开发中,文档见 https://substrate.dev/substrate-contracts-workshop/[4]

你需要知道什么

Polkadot 目前正处在 v0.7 版本,它有一个名为 Westend 的测试网和一个名为 Kusama 的有价值的金丝雀网络。Polkadot 拥有从 Rust 到 JavaScript 的各种编程语言实现[5] 。目前主要使用 Rust 基于 Substrate 框架开发。Substrate 是一个库,开发者可以通过将网络协议、共识和 Wasm 解释器组合在一起,轻松开发出整个区块链应用程序。Cumulus 是对 Substrate 的延伸,它允许任何用 Substrate 开发的链连接到 Polkadot 并成为平行链。Substrate 目前快要发布官方 2.0.0 版本,将巩固其 API。
Polkadot 并不原生支持智能合约,但是会有平行链去支持。Substrate 链可以使用为 Wasm 合约准备的 Contracts[6] pallet ,或使用 FRAME 中的 EVM[7] pallet 来增加智能合约功能。合约模块可以使链能够使用 Wasm 编译的合约,这些合约可以由用户无许可地进行部署,或者取决于该区块链的特定规则。为了促进 Wasm 智能合约的发展,Parity 也在开发  ink![8],一门用 Rust 编写,用于编写智能合约的特定领域语言。
Polkadot 计划在 2020 年初发布一个初始版本,这取决于安全审计和我们团队控制之外的上线规定。现在,既然这些工具已经开始出现并逐渐稳定下来,没有比现在更好的时机了,去投身其中并为上线做好准备吧。但是等等!在你一头栽进代码中之前,你应该考虑一下,你想要创建的去中心化应用程序的类型,并理解那些希望在 Polkadot 上开发的开发者可以使用的不同范例。

创建平行链、平行线程、智能合约有什么区别

Polkadot 为你提供了几种部署应用程序的方法:作为现有平行链上的智能合约、成为平行链或者平行线程。在使用每一种方法时都会有一些取舍,阅读本节将有助于你理解它们。
平行链是包含它们自己 runtime 逻辑的单独的链,并受益于 Polkadot 中继链提供的共享安全性和跨链消息传递。平行链有高度的灵活性和可定制性,但需要更多的成本来创建和维护。
平行线程类似于平行链,使开发者能够对其应用程序的逻辑进行较低级别的掌控。两者的主要区别在于经济成本,因为平行线程的安全成本要比平行链低得多。平行线程的成本较低是因为平行线程只在需要时生成一个块,而平行链则必须保证有一个插槽来在中继链的每个区块上都出块。在创建一条平行线程时,你将使用跟平行链相同的工具(如 PDKs ),你将得到创建一条平行链的所有好处,而没有成本的缺点。
在 Polkadot 主网上,将由平行链充当智能合约平台。智能合约是只存在于一条链上的可执行程序,其复杂度有限。因为它们存在于一条链上,所以它们可以与同一链上的其他智能合约具有平滑的互操作性。然而,它们总是受到主链固有特性的制约和限制。
如果需要对应用程序的设计和功能进行大量控制,那么平行链是更好的选择。 请记住,智能合约可以作为一个试验场所,然后再转变到功能成熟的平行链。智能合约平台通常会有更方便的工具,如 IDEs,以促进快速迭代。可以创建一个智能合约 MVP(最小可行性产品) 来衡量用户的兴趣,然后再投入到平行链的构建中。
在从头构建货币体系和链的其他方面上,平行链给予了创造者更多空间。它可以比智能合约平台更简洁高效地执行复杂逻辑。平行链在治理上也提供了更大的灵活性,并且跟现有的硬分叉方式相比,平行链进行完全升级的争议更少。
平行链或平行线程上可以具有的一些功能示例:

  • 自定义费用结构(例如,为交易支付固定费用或按字节付费)
  • 自定义原生代币和经济模型的货币政策
  • 在状态转换时财政库会获得资金
  • 一种管理 DAO 的治理机制,可以负责分配链上资金

平行链提供了构建复杂 runtime 逻辑的可能性,而使用智能合约执行复杂 runtime 逻辑成本太高。然而,与智能合约不同,平行链完全缺乏强制性的 gas 计费系统,可能容易受到导致无限循环的漏洞(智能合约中的设计阻止了这种漏洞)。
你还可以决定使用平行链、平行线程和智能合约的组合。如果你有某些需要循环的逻辑,并且无法将其移除,可以使用本地平行链 runtime 来处理所有复杂逻辑,并使用智能合约来调用迭代。如果你需要来自 oracle 的链下数据,则可能需要使用一个平行线程作为 oracle 喂价,每 24 小时触发一次(如果该数据对 Polkadot 生态系统中的其他参与者也有用,则这是最有意义的)。
很可能你已经意识到你的应用程序更适合其中哪个(或两者的混合),但如果你需要一个快速摘要来消化信息,可以使用下面这个对比表:
注意:上图不包括平行线程,但是正如我们前面提到的,平行链的所有优点同样适用于平行线程。不过平行线程的部署和维护成本更低。所以,如果平行链在上表中占了一列,那会跟平行链的那一列很像,只不过其中的 “易部署性” 和 “维护开销” 更改为 +。
本指南现在分为两个部分,具体取决于你是决定使用智能合约还是平行链来构建应用程序。请随意阅读这两个部分,或者只阅读适合你的部分。

  • 我想建立一条平行链或平行线程
  • 我想建立一个智能合约

如果你想创建一条平行链或者平行线程

现在你已经确定构建平行链或平行线程是适合你新项目的方法,下一步是决定使用哪个框架。用于构建平行链或平行线程的框架称为平行链开发工具包(PDKs:parachain development kits)。目前,仅有的可用 PDK 是来自 Parity 的 Substrate 和 Cumulus。
将来,会有许多不同的编程语言的 PDK,就像 Polkadot 主网有多种实现[9]一样。
看这里:你想从头开始构建平行链开发工具包吗?Web3 基金会将向进行此项工作的团队提供资助,想了解更多信息和申请请访问 W3F grant[10] 页面。

开启 Substrate 之旅

Substrate 是构建 Polkadot 的底层框架。它是区块链创新者的工具集,为构建链提供了必要的开发工具。它包括一个模块化的插件库,你可以从中组合你的链逻辑,也可以编写自己的模块来使用或发布到社区。
开始使用 Substrate 的最佳途径是探索 Substrate 开发者中心[11] ,这是一个由 Parity 构建和维护的在线资源。
我们建议你在里面多看看,熟悉常见的模式。一旦你有了很好的理解,你可以从 Substratekitties workshop 开始挑战自己,然后再进阶到 TCR Dappchain 教程或其他教程。

如何创建你的平行链

在用 Substrate 创建你的链逻辑之后,你将能够将其编译成 Wasm 可执行文件。这个 Wasm 代码 blob 将包含链的整个状态转换函数,这是将项目部署到 Polkadot 的平行链或平行线程所需的。
Polkadot 上的验证人将使用提交的 Wasm 代码来验证链或线程的状态转换,但这样做需要一些额外的基础设施。验证人需要某种方法来保持最新状态转换,因为 Polkadot 节点不一定也是你的链的节点。
这就是收集人节点发挥作用的地方。收集人是平行链的维护者,它在为链生成新的候选区块并将它们传递给 Polkadot 验证人来纳入中继链的过程中扮演着重要角色。
Substrate 带有自己的内置网络层,但遗憾的是它只支持独立链(即不连接到中继链的链)。然而,确实有 Cumulus 扩展包含了一个收集人节点,并允许你的底层构建逻辑与 Polkadot 兼容,不论是平行链还是平行线程。

Cumulus

Cumulus[12] 的目标是扩展 Substrate,使任何 Substrate runtime 都与 Polkadot 兼容。
它处理网络兼容性开销问题,任何平行链都需要实现这一点才能连接到 Polkadot。包括:

  • 跨链消息传递
  • 开箱即用的收集人节点设置
  • 中继链的嵌入式轻客户端
  • 波卡区块创建者兼容性
  • 集成 Cumulus 与 Substrate 链,使其成为一个平行链,能够在最小修改的情况下在 Polkadot 上运行,可能只需导入一个 crate 再敲一行代码即可。

波卡的联合创始人 Rob Habermeier 去年在 EthCC 做了一次 Cumulus 的演讲,你可以在这里[13]观看。

如何在波卡上部署你的平行链或平行线程

平行链

为了将平行链连接到 Polkadot 网络,你需要获取平行链卡槽。
平行链卡槽将在公开拍卖中出售,拍卖机制可以在 wiki 的平行链拍卖[14]页面上找到。

平行线程

平行线程不需要平行链卡槽,因此你不需要参与蜡烛拍卖机制。不过,你可以向中继链提交平行线程代码,并开始参与每个块的拍卖,以便将状态转换提交到中继链中。
有关平行线程每个区块拍卖是如何工作的更多信息,请参阅更详细的平行线程[15]页面。

如果你想创建一个智能合约…

Polkadot 中继链本身不支持智能合约。但是,由于连接到 Polkadot 的平行链可以支持任意状态转换,因此它们可以支持智能合约。智能合约的开发者可以在这些功能完善的时候使用它们。现在可以使用本地开发链开始开发,然后在技术成熟时部署到真实环境中。
Substrate 支持两种开箱即用的智能合约的方式。一种方法是使用框架库中提供的合约模块[16]。第二种方法是使用 Substrate EVM 模块[17]来部署基于 EVM 的字节码,该字节码由 Solidity 或 Vyper 编译,并使用 Ethereum 堆栈中提供的工具。
对于以前编写过智能合约的开发者来说,部署到基于 EVM 的链的操作可能更为熟悉。然而,合约模块对 EVM 的设计做出了一些显著的改进。包括:
Wasm。合约模块盘使用 WebAssembly 作为其编译目标。任何编译成 Wasm 的语言都有可能用于编写智能合约。虽然有一门专门的特定领域语言会更好,所以 Parity 提供了 ink![18] 语言。
租金。合约必须支付租金,否则必须缴纳足够多的保证金,以证明其存在于链上。当一个合约不支持这一点时,它可能会创建一个所谓的 tombstone,作为合约的参考。在某些情况下,如果合约不符合这些要求,将随其储存一起被彻底删除。
缓存。默认情况下,合约是缓存的,因此意味着它们只需要部署一次,之后,可以根据需要再进行多次具体化。这有助于将链上的存储负载降至最低。除此之外,当合约不再被使用并且已有的存款被耗尽时,代码将从存储中删除(称为回收)。
你可能需要设置一个本地测试环境开始编写智能合约。这可以使用 Substrate 节点来完成,它包含两个智能合约模块中的一个。开发完成后,你可以查看 Edgware 等项目,以便将智能合约部署到真实环境中。

Edgeware

目前带有智能合约模块的一个项目是 Edgeware[19]。Edgeware 是一个无许可的智能合约平台,正在进行链上治理的实验。对于已经创建了智能合约并希望部署到真实环境中的开发者来说,这是目前最好的选择。
Edgeware 计划在合适的时间连接到 Polkadot,并作为一条智能合约平行链。此时,智能合约将能够通过 XCMP[20]  与 Polkadot 生态系统的其他部分交互。
可在此处[21]找到 Edgeware 文档。

Ink

ink![22] 是一种特定领域语言,用于使用 Rust 编写智能合约并编译成 Wasm 代码。正如它在自述中所说,它仍然处于实验阶段,因此勇敢的开发者应该意识到,他们的开发过程可能会比较坎坷,但也能走得通。有些项目是用 ink! 开发的,并且有相当程度的复杂性,比如 Plasm 的 Plasma 合约[23],所以它其实已经足够成熟,可以开始创建一些有趣的东西了。
对于感兴趣的开发者,他们可以通过研究一些已经写好的案例[24]来开始使用 ink! 编写智能合约。这些可以作为编写更复杂的逻辑的指南,这些逻辑可以部署在智能合约平行链上。
ink! 已经为一个基于 Wasm 虚拟机并与 Substrate 链兼容的新智能合约栈奠定了基础。

部署你的智能合约

智能合约仅仅是存在于一个链上地址的代码,并且可以由外部参与者调用。关键的一点是,在任何人开始执行代码之前,你必须将代码放到链上!
在链上部署智能合约,会因你使用的特定平行链而略有不同,但通常你会发送一笔特殊交易,该交易将在分类账上创建智能合约。你可能需要为初始化逻辑和合约使用的任何存储支付相关费用。

为你的智能合约付费

每个平台都有不同的方式来支付和维护智能合约的状态。
你可能看到的一些支付智能合约的不同模式包括:
与部署每个交易相关的交易费。
定期支付链使用费来使用平台的订阅模式。
Acess token 模式,需要持有一定数量的原生代币来使用平台(EOS 有类似的模式)。存储租用。
免费试用或开发者推广。
大多数智能合约平台使用某种形式的 gas 费来限制用户可执行的操作数量。要求用户预先支付 gas 费用,没有使用的会被退还。
你需要考虑智能合约的存储和复杂性,以确保 gas 的使用保持在合理的范围内。无论你使用哪种智能合约平台,存储都可能很昂贵,因此有必要尽可能多地将数据进行链下存储。你可以考虑使用 IPFS[25] 或 Storj[26]来保存数据,而只将内容地址提交上链。

它还处于很早期…

Polkadot 上的智能合约还处于极早期,目前开发才逐渐趋于稳定。我们正在积极生产相关内容,以帮助开发者加快速度,并将在 wiki 上更新的资源。同时,你还可以关注以下链接来获取最新进展:

  • Edgeware:https://edgewa.re/[27]
  • ink!:https://github.com/paritytech/ink[28](留意 wiki 上的内容)
  • Substrate 合约模块:https://github.com/paritytech/substrate/tree/master/frame/contracts[29]

总结

本指南为你提供了一个心理模型,并展示了必要的资源,以帮助你开始构建平行链或智能合约。尽管工具还处于完善阶段,但提前做了解的好处是可以熟悉并提前开始你的项目,让你能够创建真正创新的东西。
如果你对 Polkadot 上的平行链或智能合约有一些有趣的想法,请随时在 Polkadot Riot 聊天室[30]中讨论。感兴趣的开发者可以加入  Polkadot Beginners Lounge[31] 或者 Substrate Technical[32],来进行提问。一如既往,大家可以通过媒体渠道[33]与波卡保持联系。
祝你好运!
原文:https://wiki.polkadot.network/docs/en/build-build-with-polkadot[34]
翻译:PolkaWorld 社区

参考资料

[1]为 Polkadot 做好准备你所需要的一切: https://medium.com/polkadot-network/everything-you-need-to-know-to-prepare-for-polkadot-32d08b929735

[2]PDK: https://wiki.polkadot.network/docs/en/build-pdk
[3]https://github.com/paritytech/cumulus: https://github.com/paritytech/cumulus
[4]https://substrate.dev/substrate-contracts-workshop/: https://substrate.dev/substrate-contracts-workshop/
[5]各种编程语言实现: https://wiki.polkadot.network/docs/en/learn-implementations
[6]Contracts: https://github.com/paritytech/substrate/tree/master/frame/contracts
[7]EVM: https://github.com/paritytech/substrate/tree/master/frame/evm
[8]ink!: https://github.com/paritytech/ink
[9]实现: https://wiki.polkadot.network/docs/en/learn-implementations
[10]W3F grant: https://grants.web3.foundation/
[11]Substrate 开发者中心: https://substrate.dev/
[12]Cumulus: https://wiki.polkadot.network/docs/en/build-cumulus
[13]这里: https://www.youtube.com/watch?v=thgtXq5YMOo
[14]平行链拍卖: https://wiki.polkadot.network/docs/en/learn-auction
[15]平行线程: https://wiki.polkadot.network/docs/en/learn-parathreads
[16]https://github.com/paritytech/substrate/tree/master/frame/contracts: https://github.com/paritytech/substrate/tree/master/frame/contracts
[17]https://github.com/paritytech/substrate/tree/master/frame/evm: https://github.com/paritytech/substrate/tree/master/frame/evm
[18]ink!: https://wiki.polkadot.network/docs/en/build-build-with-polkadot#ink
[19]Edgeware: https://edgewa.re/
[20]XCMP: https://wiki.polkadot.network/docs/en/learn-crosschain
[21]https://docs.edgewa.re/: https://docs.edgewa.re/
[22]ink!: https://github.com/paritytech/ink
[23]Plasma 合约: https://github.com/staketechnologies/Plasm
[24]案例: https://github.com/paritytech/ink/tree/master/examples
[25]IPFS: https://ipfs.io/
[26]Storj: https://storj.io/
[27]https://edgewa.re/: https://edgewa.re/
[28]https://github.com/paritytech/ink: https://github.com/paritytech/ink
[29]https://github.com/paritytech/substrate/tree/master/frame/contracts: https://github.com/paritytech/substrate/tree/master/frame/contracts
[30]Riot 聊天室: https://riot.im/app/#/room/#polkadot-watercooler:matrix.org
[31]Polkadot Beginners Lounge: https://riot.im/app/#/room/#polkadotnoobs:matrix.org
[32]Substrate Technica: https://riot.im/app/#/room/#substrate-technical:matrix.org
[33]媒体渠道: https://wiki.polkadot.network/docs/en/community
[34]https://wiki.polkadot.network/docs/en/build-build-with-polkadot: https://wiki.polkadot.network/docs/en/build-build-with-polkadot