深入分析 PolkaVM:相识 Polkadot 2.0 的绝佳路径

[复制链接]
发表于 2025-11-8 00:07:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
从波卡发布的 2025 门路图来看,PolkaVM 无疑是最紧张的技能更新之一,而开始摆设和应用的一个就是对 Solidity 的支持,在 Westend 的 Asset Hub 上。各人起首必要相识的是这个实现不是之前的 Frontier,它被广泛的应用在 Moonbeam 和其他支持 EVM 的平行链上,而是在新的基于 RISC-V 的 PVM 上运行 Solidity 代码。对于许多 DApp 和智能合约的开辟者,这将是进入和相识 Polkadot 2.0 的绝佳路径。由于 Solidity 的开辟者基数大,也会给 Polkadot 2.0 带来许多的开辟者,让各人可以看到 PVM 的强盛和高效的实行服从。我们先看下它的根本原理和技能架构,我们的智能合约办理方案包罗以下组件:
revive pallet这是实行智能合约的区块链模块。它像任何其他 pallet 一样添加了一堆外部函数和运行时 API。但是,它还添加了答应区块链处理处罚以太坊风格生意业务的逻辑。这些特殊生意业务不会直接提交到链中。只管这在理论上是大概的。源代码可以在此目次下检察:🔗 https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive pallet相反,用户(钱包、Dapps 等)毗连到与区块链节点一起摆设的署理服务器。此署理模仿以太坊 Json RPC,这意味着它将以太坊 JSON RPC 接口公开为服务器并作为网络客户端毗连到节点。它将以太坊生意业务重新打包成一个特殊的可调理文件,同时保持有用载荷稳定。解码以太坊生意业务并将其转换为 pallet-revive 可以明白的内容取决于上述逻辑。通过将以太坊生意业务的有用载荷逐字提交给区块,我们可以轻松调解不必要处理处罚差别生意业务格式的工具(比方区块欣赏器)。选择使用独立署理是故意为之:向节点二进制文件添加新端点必要其他客户端来实现它们。这就是我们选择这种不必要对客户端举行任何更改的方法的缘故起因。
PolkaVM这是我们与竞争技能相比做出的最显着的改变。我们使用新的自界说假造机而不是使用 EVM 来实行合约。如今,我们在运行时本身中包罗一个 PolkaVM 表明器。稍后的更新将提供在客户端内运行的完备 PolkaVM JIT。请注意,我们仍将保持表明器可用,以便我们可以为每个工作负载使用最符合的后端。比方,对于仅实行很少代码的合约调用,表明器仍然会更快,由于它可以立刻开始实行代码(惰性表明)。必要相识细节的可以去检察项目标源代码:🔗 https://github.com/paritytech/polkavm 
与 EVM 的两个根本区别是:寄存器机EVM 是一台堆栈机。这意味着函数的参数在无穷堆栈上转达。PolkaVM 基于 RISC-V,这是一种寄存器机。这意味着它在一组有限的寄存器中转达参数。如许做的紧张利益是,由于这些都是寄存器机,因此它使转换到底层硬件的步调更加高效。我们细致选择了寄存器的数量,使它们比污名昭著的寄存器匮乏的 x86-64 指令集要小。让我们将 NP-hard 寄存器分配标题简化为简单的 1 对 1 映射是 PolkaVM 快速编译时间的法门。镌汰字长EVM 使用 256 位的字长。这意味着每个算术运算都必须对这些大数字实行。这使得任何故意义的数字运算都非常慢,由于它必须转换为许多本机指令。PolkaVM 使用 64 位的字长,这是底层硬件本机支持的。也就是说,当通过 YUL(#Revive)转换 Solidity 合约时,我们仍然会得到 256 位算术,由于 YUL 太低级,无法自动转换整数范例。但是,完全可以用差别的语言编写合约并从 Solidity 无缝调用。我们假想一个体系,此中业务逻辑用 Solidity 编写,但底层架构用更快的语言编写,雷同于 Python,此中大部门繁重的工作由 C 模块完成。
Revive为了在 PolkaVM 上运行 Solidity,我们必要将其编译为 RISC-V。为此,我们必要一个编译器。它的工作原理是使用原始 solc 编译器,然后将此中央体现 (YUL) 输出重新编译为 RISC-V。与实现完备的 Solidity 编译器相比,如许做的利益是使命要小得多。通过选择这种方法,我们支持 Solidity 及其全部差别版本的全部怪癖和怪异之处。项目标所在是 https://github.com/paritytech/revive,必要相识细节的可以去检察项目标源代码。
RemixRemix 是开辟 Solidity 最盛行的工具,它是基于网页的,让我们随时都可以开辟,调试和摆设合约。Polkadot 也提供链一个本身的版本,https://remix.polkadot.io,可以通过这个网站来访问。我们维护 REMIX 的一个分支的缘故起因是,与原始版本相比,紧张的厘革是我们必要更改编译器,因此我们将 REMIX 更改为使用后端举行编译,而不是欣赏器内的编译器。这是须要的,由于我们基于 LLVM 的 revive 对于欣赏器来说太重了。
开辟实践相识完备个原理,我们可以动手实践,看下怎样来完成合约的开辟、摆设和测试。我们可以参考这个文档: 🔗 https://contracts.polkadot.io/开辟测试情况起首在 westend asset hub 中已经集成了 revive pallet,可以直接在上面开辟和测试。
固然你也可以搭建本身的当地测试情况,如许更容易检察后端日记,相识错误信息。1. 下载 polkadot sdk 的代码并编译 Kitchensink node2. 启动 node3. 单独编译 Eth RPC Proxy4. 启动 RPC 服务当以上服务都启动之后,平凡的 substrate 的服务会在 9944 端口,Eth 会使用 8545 端口。Solidity 合约起首我们可以实行 Solidity 合约,你可以直接使用 Remix 来开辟。在 Environment 中,默认已经有 westend 的设置了,假如使用当地情况来测试,可以增长 customize 的设置。
如许就可以通过和我们之前启动的 Eth RPC 服务交互。固然假如是开辟一个复杂 Dapp 应用,可以使用其他框架。这里保举各人使用 Typescript 和 Viem 来实行,我们可以参考 revive pallet 自带的测试代码:🔗 https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive/rpc/examples/js它另有使用 Rust 语言的版本,在和它平行的目次下。一个摆设合约的简化版代码如下:import { createWalletClient, defineChain, Hex, http, parseEther, publicActions } from 'viem’import { readFileSync } from 'node:fs’import { walletClient } from ‘./utils’
function getByteCode(name: string): Hex {   const bytecode = readFileSync(pvm/${name}.polkavm)   return 0x${Buffer.from(bytecode).toString('hex')}}
async function main() {   const piggyBankAbi = [] as const;   const piggyBankByteCode = getByteCode(“piggyBank”)   const wallet = await walletClient;
const hash = await wallet.deployContract({       abi: piggyBankAbi,       bytecode: getByteCode(‘piggyBank’),   })
const deployReceipt = await wallet.waitForTransactionReceipt({ hash })   const contractAddress = deployReceipt.contractAddress
const balance = await wallet.readContract({       address: contractAddress,       abi: piggyBankAbi,       functionName: ‘getDeposit’,   })
{       const { request } = await wallet.simulateContract({           account: wallet.account,           address: contractAddress,           abi: piggyBankAbi,           functionName: ‘deposit’,           value: parseEther(‘10’),       })       const hash = await wallet.writeContract(request)
  1.    const receipt = await wallet.waitForTransactionReceipt({ hash })       console.log(`Deposit receipt: ${receipt.status}`)
  2.    const balance = await wallet.readContract({           address: contractAddress,           abi: piggyBankAbi,           functionName: 'getDeposit',       })   }}
复制代码
main()

  • 起首我们初始化一个 wallet client。2. 怎样使用 abi 和 bytecode 来摆设一个智能合约,这里我们选择 examples 内里的一个简单合约,piggyBank。必要注意的是这里的 bytecode 是编译成 polkavm 的代码。3. 调用一个读取的函数。4. 发送一个生意业务去更新在合约内里的这个值。5. 在生意业务完成后再次检察值是否得到来更新。Rust 直接写合约除了使用 Solidity,我们也可以直接使用其他语言来写合约,然后编译成 polkavm 的代码然后直接摆设。这里我们参考 https://github.com/paritytech/rust-contract-template。直接摆设 polkaVM 合约,我们就不必要使用 Eth RPC 了。当合约编译好了之后,我们可以使用 revive 的 upload 方法将合约上传到链上。
    在调用乐成之后,我们可以在欣赏器的 event 内里找到 code 的 hash,好比在我的例子内里,hash 值是 0x9bef6d3f29397e4994d96657375674096379ba850c31f8c7b950a6f9c13a238d下面一步就是对合约实例化,调用 revive 的 Instantiate 方法。
    这里会遇到一个 account unmapped 错误。必要先调用 account map 的方法,才华摆设合约和调用。
    然后再一次实行实例化,就会乐成。
    我们来记载一些合约所在,它是一个尺度的 Eth 所在,在这次摆设中,合约所在是 0xce58c0af740d49e573998ce92c9147565604d321。末了我们调用 revive 的 call 方法,填入之前实例化的合约所在。如许我们就完成了一个 PolkaVM 合约的开辟,摆设和测试。
连续 build当完成来根本的情况搭建,开辟流程,之后就可以完成更加复杂的业务逻辑。总的说来,polkaVM 还处于早期,各人遇到了标题,大概盼望资助完成一些功能,修复 bug 都可以积极向这些 repo 提交 PR。信赖随着 2025 年 polkadot 2.0 的功能渐渐 delivery,polkaVM 的使用场景和使用范围会越发

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表