本文介绍了如何在本地环境中搭建PolkaVM的开发环境,并使用Rust语言编写智能合约。PolkaVM兼容EVM且架构更优,利用Substrate框架的强大功能,为Web3开发者提供了一个有吸引力的选择。文章提供了详细的步骤,包括运行substrate节点、eth-rpc节点,以及如何编译和部署Rust智能合约。
当然,许多身处 web3 领域的人都知道,web3 最流行的应用环境是 EVM。同时他们也知道现在的 EVM 存在一些问题。例如性能问题,Solidity 的一些问题等等。但即便 EVM 有一些问题,EVM 的流行度依然很高。老实说,我不知道原因。
从几年前开始,一些网络开始涌现。Polkadot、Near、Solana、Sui 等等。这些网络旨在使用另一种架构(如 WASM)来改进 EVM。但即使这些网络拥有更好的技术或架构,也没有任何一个网络能比 EVM 吸引到更多的开发者。我认为这是以太坊社区的力量。所以我认为只要社区的力量持续下去,EVM 仍将是 web3 开发环境的首选。
这就是为什么我对 PolkaVM 非常感兴趣。
PolkaVM 兼容 EVM,但拥有比现有 EVM 更好的架构。并且 Substrate 是 Polkadot 的区块链框架,具有构建区块链网络非常强大且实用的功能,比如 无分叉升级。这是 PolkaVM 的一大优势。
上个月,我介绍了“使用 PolkaVM 的第一步 (he first step of using PolkaVM)”。今天我想介绍下一步。即“创建本地环境”和“使用 Rust 实现智能合约”。
我想介绍 这个教程。
正如许多 web3 开发者所知,我们绝对需要本地环境,例如运行本地节点和 IDE,因为如果我们可以使用本地节点,我们可以比测试网和主网更快地获得响应,因此,我们不需要任何必须从 faucet 和加密货币交易所获得的 token。
注意:截至目前,PolkaVM 只有 Remix 作为 IDE,但没有其他更好的 IDE,例如 hardhat。
此图是本地节点的结构。PolkaVM 在 “substrate-node” 中工作,而 “eth-rpc” 转换协议的差异。
请像教程一样拉取 polkadot SDK 的源代码。请注意,最新版本的源代码不适用于本教程。因此,请确保检出正确的提交版本。
https://contracts.polkadot.io/work-with-a-local-node
接下来是运行 substrate 节点。
https://contracts.polkadot.io/work-with-a-local-node#build-and-run-the-kitchensink-node
如果你成功运行 substrate 节点,接下来是运行 eth-rpc 节点。
https://contracts.polkadot.io/work-with-a-local-node#build-and-run-eth-rpc-proxy
现在,你可以使用 URL (“http://localhost:8545) 连接到本地节点。
正如官方教程所说...
使用 PolkaVM 而不是 EVM 的好处之一是,你可以使用任何可以编译为 RISC-V 的语言编写合约。
好的。因此,我将介绍如何按照 官方教程 使用 Rust 编写 PolkaVM 智能合约。步骤如下...
首先,下载合约模板。
git clone https://github.com/paritytech/rust-contract-template.git
要编译此模板,我们使用此项目中包含的 “build.sh”。请检查当前目录。
./build.sh
编译完成后,你可以在目录中找到 “contract.polkavm” 文件。
我使用本地节点来部署合约。
请创建另一个目录,并在该目录中创建节点项目。
npm init
接下来创建新文件,例如 “deploy.js” 并粘贴以下源代码。
注意:你必须将 “contract.polkavm” 复制并粘贴到当前目录。
import { readFileSync } from 'fs'
import { ethers } from "ethers";
/// 我们手动指定 abi,因为 Rust 编译器不会为我们生成一个
const abi = ["constructor()", "function fibonacci(uint) view returns(uint)"];
const bytecode = readFileSync('contract.polkavm');
const privateKey = "YOUR PRIVATE KEY";
const rpcUrl = "http://localhost:8545";
const provider = new ethers.JsonRpcProvider(rpcUrl);
const wallet = new ethers.Wallet(privateKey, provider);
// 实例化一个合约工厂。
const contractFactory = new ethers.ContractFactory(abi, bytecode, wallet)
try {
const contract = await contractFactory.deploy();
await contract.waitForDeployment()
// 获取合约的地址。
const address = await contract.getAddress()
console.log(`Contract deployed: ${address}`)
} catch (e) {
console.error('Failed to deploy contract', e)
}
现在,部署合约的准备工作已就绪。
我们需要部署调用者合约。我们使用此合约来与 Rust 合约交互。
通过使用 remix,你必须创建调用者合约文件并进行编译。
你可以从 此处 获取调用者合约。
你可以像以下方式调用 Rust 合约。你需要将你使用 “deploy.js” 部署的 “合约地址” 设置为 “rustLib”。
截至目前,当我检查 Rust 模板时,似乎我们需要实现如下类型转换逻辑。但也许其他模板或开发工具可以解决这些问题。届时,我们可以轻松实现 Rust 合约。
- 原文链接: blog.blockmagnates.com/i...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!