利用 WebAssembly 技术,在 Substrate 区块链中运行以太坊合约
Running Ethereum smart contracts in a Substrate blockchain
原文链接 https://medium.com/ethereum-on-steroids/running-ethereum-smart-contracts-in-a-substrate-blockchain-56fbc27fc95a 作者 Michael Yuan 是 SecondState 的 CEO,也是 WasmEdge 的核心开发者。
随着 Substrate(和 Polkadot)的普及,越来越多的人需要在基于 Substrate 的区块链上运行 Ethereum 智能合约和 Dapp。以太坊开发人员通过拥有更快、更稳定和更多功能的基础设施来部署他们的应用程序。Substrate 区块链受益于一个丰富的去中心化应用生态系统。
ParaState(和 Second State)团队开发了一款软件,可以在 Substrate 区块链上运行 Ethereum 智能合约。它支持用 Solidity 和其他 WebAssembly 兼容语言编写的智能合约,并支持基于 polkadot.js 和 web3.js 的Web应用程序前端。
使用在线编辑器 BUIDL
BUIDL (https://github.com/second-state/buidl) 是一个构建 dApp 的在线 IDE。ParaState Frontier 项目演示了如何创建一个 Substrate 区块链,包括:
传统 EVM,用于运行 solc 编译器编译的 Solidity 智能合约。
基于 SSVM 的下一代 Ewasm VM,用于运行从 Solidity(通过 SOLL 编译器)或Rust 或其他语言编译的以太坊风格的WebAssembly智能合约。
Web3 网关,允许用户提交部署合约和调用合约函数的交易。
ParaState Frontier 软件可以根据交易的 Payload 来确定交易应该基于 EVM 还是 Ewasm,并动态路由到 EVM 或 SSVM Ewasm。
下面是一个已经启动的 ParaState 测试网络,web3 RPC 端点为:
https://rpc.parastate.io:8545/
通过 web3 RPC,我们可以使用 Second State 创建的 BUIDL 在线 IDE 创建、部署和测试 Solidity 智能合约。在浏览器中加载 ParaState 的 BUIDL。
http://buidl.secondstate.io/parastate
下面的视频展示了如何创建、编译和部署一个简单的 Hello World 智能合约到 ParaState 测试网络。它还演示了如何调用部署的智能合约上的函数。
接下来,让我们尝试一个更复杂的智能合约——用于发行代币的 ERC20 合约。下面的视频演示了如何向部署的合约发送交易以铸造和转移代币,从而改变合约的内部状态。
最后,让我们来看一个高级智能合约——用于非同质化代币(NFT)的 ERC721 合约。该视频展示了如何部署合约、将NFT铸造给自己并将NFT转移到另一个地址。
可以在这里找到更多关于如何通过 web3 RPC 服务部署和使用 SSVM Ewasm 智能合约的示例。
您可能已经注意到,web3 RPC 和 BUIDL IDE 使 ParaState 测试网络非常类似于Ethereum 区块链。用户使用Ethereum地址和钱包签署和发送交易。Substrate 完全在幕后管理和存储区块链上的信息。BUIDL 用户不需要拥有 Substrate 账户地址。实际上,用户甚至不需要知道底层区块链是基于 Substrate 的。
然而,在许多情况下,用户可能希望将 Solidity 智能合约部署和运行为 Substrate 用户。也就是说,使用他的 Substrate 地址和钱包签署和发送交易以部署和调用智能合约。当用户在 Substrate 生态系统中运作时,例如 Polkadot,这是必要的。为了支持这种用例,ParaState 软件允许用户从 polkadot.js 门户和钱包提交 Ewasm 合约交易。
使用 polkadot.js 运行智能合约
substrate-ssvm-node 项目演示了如何创建一个带有以太坊风格的 WebAssembly(Ewasm)智能合约运行时的区块链。它使用 pallet-ssvm 组件来验证和执行智能合约。智能合约可以用 Solidity 或 Rust 编写,编译为 WebAssembly 字节码,并通过 polkadot.js 提交到区块链上执行。
由于 polkadot.js 只能提交 Substrate 交易,我们需要一种将 Substrate 地址映射到唯一的 Ethereum 地址的方法。pallet-ssvm 使用哈希算法将 Substrate 地址转换为 Ethereum 地址。当用户从 polkadot.js 提交 Substrate 交易时,交易由用户的 Substrate 地址签名。substrate-ssvm-node 验证交易签名,然后使用相应的 Ethereum 地址在 SSVM Ewasm 运行时中执行内容。
下面的视频展示了如何在 polkadot.js 中找到与当前 Substrate 地址关联的 Ethereum 地址。它要求您使用 SOLL 编译器编译和部署一个小型的 Solidity 合约。然后,您将从 polkadot.js 中调用合约的一个函数,并在结果中看到调用者的 Ethereum 地址。
接下来,您可以使用 SOLL 将 ERC-20 合约编译为 WebAssembly。
现在,使用 polkadot.js 门户部署合约,并将代币铸造给自己(即与您在 polkadot.js 中关联的 Substrate 地址对应的 Ethereum 地址)。
就这样!您已经学会了如何从 Ethereum 钱包和 Substrate 钱包部署和调用 Ethereum 智能合约。去创建您自己的智能合约吧。编写愉快!