值得信赖的区块链资讯!
Sub0 开发者大会 Patract 篇:Wasm 智能合约
在刚刚结束的 2021 Sub0 在线会议中,Patract Labs 教育负责人 CryptoJedi 围绕「Patract Labs 上的 Wasm 智能合约」这个主题,通过演示开发者如何使用 Patract Labs 的开发工具 Redspot(合约开发脚手架)、Metis(Wasm 合约标准库)和 Europa(本地测试开发节点),推动智能合约的开发。包括工具安装以及在 Ink! 和 Ask! 中编写简单的合约,由 Metis 提供自动部署和测试。最后,他向大家展示了如何使用 Jupiter 测试网部署合约并与之交互。(演示视频将在后期发布)
Jupiter
Ask!
Redspot
Metis
Europa
Parascan
Himalia
我们中的许多人都玩过 Ink!。然而,WASM 的一大优势是 WASM 支持编译成它的编程语言。墨水!很好,但它需要开发人员熟悉 Rust 作为先决条件。因此,我们创建了 Ask! 这是一种类似于ink! 的eDSL。有了 ask!,任何有 typescript 或 AssemblyScript 经验的人都可以轻松开发 WASM 智能合约。总的来说,我们正在努力将 Solidity 风格的开发引入 Substrate。
eDSL
-
整体布局类似 ink!
-
AssemblyScript中的语法
Decorator
-
类似于ink!中的宏,Ask!提供装饰器。这给出了非常相似的代码布局。
-
高水平的抽象,开发者可以专注于合约逻辑,而不必学习如何与主机函数和 pallet-contract 进行交互。所有复杂的东西都由 Ask!在引擎盖下完成。
Storage
-
SpreadStorableMap
-
SpreadStorableArray
-
PackedStorableMap
-
PackedStorableArray 当需要存储大量数据时,应该使用 Spread。当你存储少量数据,并需要访问大部分内容时,比如搜索或统计逻辑,选择Packed可能会更好。
接口和继承
-
Solidity 开发人员可以很快习惯使用Ask!
-
支持类似于 Openzeppelin 的标准合约库。
正在开发中
-
目前我们的版本是 v0.2,很快就会发布 v0.3。
模板
-
基于合约标准,自动生成合约样本、部署脚本、测试脚本和 Redspot 配置。例如。npx redspot-new erc20将创建一个带有 ERC20 代码、部署和测试的目录。你不不要手动编写部署和配置。我们正在将更多的模板集成到 Redspot 中。所以在未来,你可以用一个命令启动任何合约站。
-
npx 支持,无需额外设置。
编译
-
包装 cargo-contract。 -
npx redspot compile。 -
npx redspot 编译器将编译代码并放入对应的目录进行部署。
部署
-
上传合约并使用脚本将其实例化。
-
npx redspot run scripts/deploy.ts --no-compile
测试
-
使用脚本测试合约方法。 -
npx redspot test --no-compile
控制台
-
用于集成测试的强大 JavaScript 交互式控制台。
-
控制区块链操作。
-
在编写详细的测试代码之前,你可以在控制台中进行发挥,了解 Redspot 的工作原理。了解如何测试你的合约等。
-
npx redspot explorer
Docker
-
很多时候,一个合约将部署在多个区块链上,Redspot 与 Docker 集成,允许一个合约在多个平台上进行测试。 -
启动 Docker: npx redspot testnet -
在 Docker 上编译: npx redspot compile --docker true。
插入
-
不足以满足你的开发需求。
-
用自定义插件扩展 Redspot,增加更多功能,与其他开发工具集成。
-
通过简单地编写你的自定义插件扩展类型,来保持与自定义Substrate链的兼容
浏览器 GUI
-
@polkadot/apps ,但重点是合约。
-
与 Redspot 配置完全集成,一旦你设置了测试区块链,就不需要更多的操作。
目前在 ink! 开发时的问题
-
缺乏标准库使得智能合约不安全。由于智能合约中的错误,2016 年的 DAO 攻击窃取了 360 万个 ETH。这次攻击对以太坊主网非标准化合约强制硬分叉,造成了巨大的经济损失,并进一步影响区块链的共识。想象一下,在 2021 年,人们真的会质疑你的区块链的安全性,即使那是由合约开发者造成的。
开发者必须手动复制/粘贴现有的实现
-
源代码可能是未经审计的,且使用起来不安全。 -
想象一下从另一个智能合约项目复制代码。他们的合约可能有尚未被注意到的错误。肆无忌惮地复制他们的代码可能会在未来造成巨大的问题。
-
在此过程中费时费力,且容易出错。 -
复制粘贴时可能会漏掉一些逻辑。
-
或者你误解了他们的逻辑,因为他们可能没有正确地命名他们的函数。
-
你浪费了大量时间来更新他们的合约,每次发布都重复复制和粘贴
介绍 Metis
-
为了彻底解决上述问题,我们创建了 Metis。
-
基于可重复使用的组件的标准合约库。 -
与 Openzeppelin 的继承模型不同,Metis 是基于组件的,这意味着用户不会直接继承标准实现。相反,Metis 提供了一组可重用的组件供用户组装。
Metis vs OpenZepplin
-
继承——由 Openzeppelin 使用 -
优点:简单—— 最小化为开发人员编写的代码。
-
缺点:模糊性——隐藏方法的定义;不确定的继承树与多个继承关系。 -
例如,在 OpenZepplin 中,当你有多个继承时,你可能很难确定该方法是从哪个父合约中继承的。
-
组合——由 Metis 使用 -
优点:明确性——提高代码可读性和可听性,用户可以交互的所有功能都被编码到位,这使得代码审计更容易。
-
缺点:重复性——为现有实现重复编写相同的代码。
MCCI 架构
-
数据模型——存储。
-
组件——实现。
-
控制器——结合不同的组件,ERC20Pausbale -> ERC20, pausable, ownable。
-
接口——不可变和可变功能,用户交互。
Metis—vs Native ink!(Storage)
-
用户不再需要自己声明变量了。
-
标准化数据结构。 -
让 Dapp 的开发者更容易熟悉接口。
Metis—vs Native ink!(Constructor)
-
跳过变量初始化的过程。
-
无需手动触发事件。 -
开发者可能会忘记触发事件,这将导致区块链浏览器无法捕捉更改,并让用户很难验证他们的交易。
Metis—vs 原生 ink!(Event)
-
由于 ink! 的当前设计,Event 的写法几乎保持不变。在不久的将来会有所缓解。 -
我们将使用宏来自动生成基于 Metis 组件的事件。例如,如果你有一个名为 ERC20Pausable 的合约,我们将生成包括在存储声明中的所有事件。
ink!Metis—vs 原生 ink!(Message)
-
Metis实现包含默认方法实现,确保余额转移的安全性。 -
例如,检查余额。 -
注意实现中可能存在的所有注意事项。
-
允许开发者更多地关注他们的核心逻辑。
设计原则
-
在软件设计中重写函数显得很愚蠢。
-
在右侧写代码。 -
更加自然。
-
跳过编写所有冗余的代码。
-
实例化是指在区块链上创建一个智能合约的实例。
-
调用另一个实例的方法意味着调用另一个合约方法。
-
跨合约调用以最终会产生错误的结果。
多个组件的组成
-
无需在存储中列出所有需要的变量。
-
按需组合,创造更多可能性。
开箱即用的本地测试网
-
Europa 是 Subtrate 区块链的另一个实现,特别关注于智能合约的开发。
-
为了更好的开发体验,我们去掉了共识。原因是当我们使用 Canvas 开发合约时,我们发现自动生成的区块真的很困扰我们。因此,Europa 只有在收到新的用户签名交易时才会生成区块。
-
没有 Wasm Runtime 。虽然 Wasm Runtime 很好,因为它不允许硬分叉区块链升级,但它给调试合约执行带来了更多困难。
-
状态 KV 数据库。当新的区块被挖掘时,这个额外的数据库会跟踪所有的状态变化。当我们在调试智能合约时非常有用,因为我们可以确定合约真正改变了区块链的底层状态。
-
修改 contract-pallet。现在,运行 Wasm 智能合约对于合约开发者来说就像一个黑匣子,因为它不会打印出所有的执行细节。因此,我们修改contract-pallet ,允许节点打印出所有执行细节。
Europa UI
Europa UI – 演示
-
检查所有状态变化。
-
进行 RPC 调用。
-
使用跟踪进行 RPC 调用,以获取更多关于合约执行的见解。
-
嵌套合约调用可能非常混乱。
-
清楚地说明了跨合约调用的工作原理。
Europa CLI
-
自定义 RPC -
europa_forwardToHeight:将区块链转发到一个指定的高度。
-
europa_backwardToHeight:将区块链还原到一个指定高度,并删除该高度之后的所有区块链状态。
-
europa_modifiedStateKvs:获取所有区块链状态变化。
-
自定义命令 -
状态 – kv:与 RPC 相同:europa_modifiedStateKvs -> 获取所有区块链状态变化。
-
工作区 – 允许开发者针对不同的测试场景切换到不同的工作区。
-
合约执行的详细日志记录: -
它将在合约执行期间跟踪和打印所有参数和区块链变化。
-
提供 Wasm panic 回溯以准确定位智能合约中发生错误的位置。
演示
npx redspot-new erc20记得修改cargo.toml中的依赖关系,从crate.io拉取,否则会与polkadot.js产生兼容问题。ink!更新速度很快,如果我们直接从 ink! git 拉取,会产生兼容问题。我们也看到 Polkadot/app 的问题,但通常它很快就会被修复。
ink_primitives = { version = "3.0.0-rc5", default-features = false }ink_metadata = { version = "3.0.0-rc5", default-features = false, features = ["derive"], optional = true }ink_env = { version = "3.0.0-rc5", default-features = false }ink_storage = { version = "3.0.0-rc5", default-features = false }ink_lang = { version = "3.0.0-rc5", default-features = false }
-
redspot.config.ts: 包含 Redspot 的所有配置,例如网络配置。
-
scripts/deploy.ts: 是将合约部署到区块链的部署脚本。
-
tests: 包含所有为集成测试编写的测试。
-
Windows 10 (21H1 及以上) europa-ui-v0.3.32-x86_64-win.exe(https://github.com/patractlabs/europa-ui/releases/download/v0.3.32/europa-ui-v0.3.32-x86_64-win.exe)。
-
MacOS(10.15.7 及以上)europa-ui-v0.3.32-x86_64-darwin.dmg(https://github.com/patractlabs/europa-ui/releases/download/v0.3.32/europa-ui-v0.3.32-x86_64-darwin.dmg)。
-
Ubuntu(20.04 及以上)europa-ui-v0.3.32-x86_64-linux.AppImage(https://github.com/patractlabs/europa-ui/releases/download/v0.3.32/europa-ui-v0.3.32-x86_64-linux.AppImage)。
对于 Ubuntu,记得给它权限
chmod +x europa-ui-v0.3.32-x86_64-linux.AppImage。
-
只需双击该图标即可启动它。确保默认端口没有被占用。
-
单击开始以启动节点。
px redspot run scripts/deploy.ts它将编译合约并更新合约 + 元数据到 Europa-UI。如果元数据没有被正确上传,你可以手动添加。
-
打开 Europa-UI,你应该可以看到合约已经部署成功。
-
你可以使用back to Block 来恢复区块链并删除已部署的测试合约。
-
cp -R contracts ink_contracts -
让我们细致的研究下引入metis后合约代码实现的区别: -
Cargo.toml:导入我们将使用的 Metis 组件。注意 metis_lang 是使用 Metis 的项目的必备条件。另外,注意我们使用的是分支,因为 ink! 的更新非常频繁,为了与 ink! 保持兼容,我们有相应的 Metis 版本。 -
lib.rs: -
我们从 Metis 导入所有依赖项,而不仅仅是use ink_lang as ink;
-
Storage:我们不再声明我们自己的变量,而是复合了多个 Metis 组件。
-
Event:不幸的是,我们仍然需要为事件编写所有代码。在 Metis 的下一个版本中,我们将使 Metis 生成这些事件,只要我们在存储中声明了它们。
-
Message:我们不再需要自己去实现函数,我们可以使用 Metis 的默认植入方式。
-
Constructor:这些函数没有暴露给区块链上的用户,Metis 的宏会自动生成其中的大部分。所以我们不再需要自己编写它们。
-
Metis 的组成特点:
-
正如我们在PPT中提到的,Metis 允许用户根据需要轻松地将不同的组件组合起来。 -
扩展: -
hook:你可能会问为什么我们没有在我们的方法实现中添加特定的逻辑来暂停传输。那是因为我们在 Metis 中使用 hook,并且对于每个组件,我们都有一个实现 hook 的扩展列表。
-
ERC20 扩展:https://github.com/patractlabs/metis/blob/main/crates/components/token/erc20/src/extensions/pausable.rs。该扩展覆盖了before_token_transferhook ,并在其中添加了逻辑。所以我们不再需要在拥有的每个传递函数中实现可暂停的逻辑。
cd contractscargo +nightly contract build --keep-debug-symbols --optimization-passes=0然后把它复制到 ERC20 目录下的 artifacts 目录。 这将在调试模式下构建合约并保留所有调试符号。
mkdir ../artifactscp ./target/ink/erc20_pausable.contract ../artifacts/cp ./target/ink/metadata.json ../artifacts/erc20_pausable.json7.编写部署脚本。
-
从deploy.ts复制代码。
-
npx redspot run scripts/deploy.ts --no-compile -
打开 Europa-UI, 查看合约是否部署成功。
-
从test(https://github.com/bonanyuan/sub0_erc20_pausable/blob/main/tests)中复制所有代码文件。 -
npx redspot test ./tests/erc20_pausable_init.test.ts --no-compile -
测试合约实例化。 -
npx redspot test ./tests/erc20_pausable_ownable.test.ts --no-compile -
所有者被初始化为发件人的地址。 -
非所有者将能够放弃所有权。 -
所有者应该能够放弃所有权。 -
非所有者不能够转让所有权。 -
所有者可以转让其所有权。 -
npx redspot test ./tests/erc20_pausable_init.test.ts --no-compile -
默认暂停状态为 false。 -
非所有者应该能够暂停。 -
所有者应该能够暂停。 -
所有者可以取消暂停。 -
没有暂停的传输应该是成功的。 -
有暂停的传输应该是失败的。
从EVM到Wasm的范式转换,为什么波卡会成为公链的常青树?
比推快讯
更多 >>- Coinbase 恢复 Polkadot (DOT) 转账与质押支持
- 美议员 Cynthia Lummis 呼吁社区银行拥抱比特币与加密货币
- Ripple 与 Mastercard、WebBank 和 Gemini 合作,试点使用 RLUSD 进行信用卡结算
- 道琼斯指数收盘上涨 225.76 点,标普 500 和纳斯达克均上涨
- 美股三大股指收涨,美光科技涨近 9%,超微电脑跌 11%
- 据比推数据,ETH现报3465.30美元,24小时涨幅为5.86%,价格波动较大,请谨慎交易,控制风险。
- 特朗普称赞加密货币,称其减轻美元压力
- 数据:BTC 全网合约持仓量 24h 增长 5.59%
- “扛单巨鲸”平仓 ETH 空单,账户仅剩 57 万美元
- GiggleFund:12 月 1 日起,Binance 上每笔 Giggle 交易均会减少代币供应
- 英国央行副行长:美英在稳定币监管上保持同步非常重要
- 美联储理事米兰:基于市场的核心 PCE 更接近 2%
- Balancer 发布漏洞攻击事件报告:系批量兑换交易四舍五入逻辑错误被利用
- ZOAI 宣布推出 ZOAI PRO 2,平台代币 $ZOAI 将于 BSC 同步上线
- 美联储理事米兰:认为继续降息仍然是合理的
- 米兰:预计未来将出现更多投资需求
- 美联储理事米兰:ADP 数据是个令人欣喜的意外,美国政府停摆前的就业市场趋势似乎依然存在
- 某用户因签署恶意“permit”签名损失 30.4 万美元 aBasUSDC
- World Liberty Financial 宣布收购 USD1 代币作为战略储备,推进 Solana 生态建设
- WLFI:已建仓 Meme 币 1 作为战略储备
- 花旗银行:加密货币疲软源于 ETF 资金流入放缓和风险偏好减弱
- Galaxy 研究主管:将对比特币年底价格的预测目标下调至 12 万美元
- RedStone 推出 HyperStone 预言机,为 Hyperliquid 上无许可市场提供支持
- 美国最高法院正式开始听取有关特朗普关税的论点
- Solana 基础设施初创公司 Harmonic 完成 600 万美元种子轮融资,Paradigm 领投
- Monad 将于 11 月 24 日 TGE
- 某疑似属于 Flowdesk 的地址从币安提取 400 万枚 ENA
- Lido 与 Chainlink 达成合作,将 CCIP 作为 wstETH 跨链基础设施
- 灰度宣布免收 Solana ETF 管理费,直至基金资产管理规模达 10 亿美元
- 美股开盘加密板块普涨,BitMine 上涨 3.32%
- Dinari 利用 Chainlink 将 S&P DJI 即将推出的加密市场指数代币化
- WisdomTree 与 Chainlink 合作,将代币化私募信贷基金 CRDT 的净值数据上链
- 过去 4 小时全网爆仓超 5000 万美元,主爆空单
- Stable:预存款活动第二阶段将于明日 22 时开启,上限 5 亿美元
- Solana Company 启动 1 亿美元股票回购计划
- OFA Group 完成 5000 万美元 PIPE 融资,Greentree 等领投
- Ripple 完成 5 亿美元融资,Galaxy Digital 等领投
- 数字资产风投 CMT Digital 旗下基金完成 1.36 亿美元募资
- 某新建钱包向 HyperLiquid 存入 249.8 万枚 USDC 后做多 BTC、PUMP 和 FARTCOIN
- Ripple 获 5 亿美元投资,Fortress 和 Citadel Securities 领投
- 今日美国比特币 ETF 净流出 5057 枚 BTC,以太坊 ETF 净流出 12408 枚 ETH
- 特朗普:呼吁结束政府停摆,称美股创新高只是开始
- 哈萨克斯坦央行考虑用黄金和外汇储备购买加密货币
- “麻吉大哥”加仓 ETH 多单,当前持仓价值约 405 万美元
- 美国将季度再融资规模设定为 1250 亿美元
- “扛单巨鲸”再次加仓 259.83 枚 ETH,最新持仓 7692.77 枚 ETH
- 美国总统特朗普:股市将再创新高
- YZi Labs 宣布 Haley Huang 与 Ricky Wang 加入团队
- 美股上市公司 Streamex 完成 2500 万美元首期可转换债券融资以推进代币化黄金计划
- 美国 10 月 ADP 就业人数 4.2 万人,预期 2.8 万人
比推专栏
更多 >>观点
比推热门文章
- Coinbase 恢复 Polkadot (DOT) 转账与质押支持
- 美议员 Cynthia Lummis 呼吁社区银行拥抱比特币与加密货币
- Ripple 与 Mastercard、WebBank 和 Gemini 合作,试点使用 RLUSD 进行信用卡结算
- 道琼斯指数收盘上涨 225.76 点,标普 500 和纳斯达克均上涨
- 美股三大股指收涨,美光科技涨近 9%,超微电脑跌 11%
- 特朗普称赞加密货币,称其减轻美元压力
- 数据:BTC 全网合约持仓量 24h 增长 5.59%
- “扛单巨鲸”平仓 ETH 空单,账户仅剩 57 万美元
- GiggleFund:12 月 1 日起,Binance 上每笔 Giggle 交易均会减少代币供应
- 英国央行副行长:美英在稳定币监管上保持同步非常重要
比推 APP



