当前位置: 首页 > wzjs >正文

云电子网站开发网站权重查看

云电子网站开发,网站权重查看,服装公司网站建设策划,网站建设技术知乎Polkadot 在 2.0 里面引入了新的 PolkaVM 来支持智能合约的运行,并且使用Revive Pallet 兼容 EVM。通过 Resolc 的编译,solidity 代码可以在 PolkaVM 上更加高效的运行。 在一般的 EVM 执行环境下,precompile 都是一个不可缺少的部分&#x…

图片

Polkadot 在 2.0 里面引入了新的 PolkaVM 来支持智能合约的运行,并且使用Revive Pallet 兼容 EVM。通过 Resolc 的编译,solidity 代码可以在 PolkaVM 上更加高效的运行。

在一般的 EVM 执行环境下,precompile 都是一个不可缺少的部分,能够提供一些通用的功能,例如 ecrecover 方法。比如在 Moonbeam中,precompile 的合约可以参考这个文档:Canonical Contract Addresses on Moonbeam(🔗: https://docs.moonbeam.network/builders/ethereum/canonical-contracts/#ethereum-mainnet-precompiles)。Revive Pallet 同样提供了一些 precompile 的合约给开发者使用。

01

代码分析

我们在 polkadot sdk 的代码库中,打开 precompiles(🔗: https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/revive/src/pure_precompiles) 这个目录中,我们可以看的一些 precompile 合约的源代码。以 sha256 作为参考,它的代码实现非常简单,需要实现 Precompile 这个 trait。二个参数分别是对使用过的 gas 存贮的对象和一个 u8 类型的数组。它只需要通过调用 sp_io 里面的函数,然后返回就可以了。

/// The Sha256 precompile.pub struct Sha256;impl<T: Config> Precompile<T> for Sha256 {fn execute(gas_meter: &mut GasMeter<T>, input: &[u8]) -> Result<ExecReturnValue, &'static str> {		gas_meter.charge(RuntimeCosts::HashSha256(input.len() as u32))?;		let data = sp_io::hashing::sha2_256(input).to_vec();Ok(ExecReturnValue { data, flags: ReturnFlags::empty() })	}}

对这些 precompile 的调用入口在 pure precompile.rs (🔗 https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/revive/src/pure_precompiles.rs#L59) 源文件里面,execute 方法通过合约地址的最后一个字节来找到需要调用的合约。可以看到 Sha256 的编号是 2,而 ECRecover 的是 1.

图片

为什么只比较最后一个字节,因为我们把前 19 个字节都是 0 的分配给了 precompile 地址空间。

pub fn is_precompile(address: &H160) -> bool {    let bytes = address.as_bytes();    bytes.starts_with(&[0u8; 19]) && bytes[19] != 0 }

在运行到合约执行的时候,runtime 总是先通过地址来判断是否为 precompile 的合约。这个判断逻辑在 call (🔗: https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/revive/src/exec.rs#L1485) 和 delegate call (🔗:https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/revive/src/exec.rs#L1564) 最开始进行,如果是 precompile 合约,直接转到 Runtime 里面运行。不同版本的代码行数可以有区别,只需要搜索 is_precompile 就可以。

02

调用和验证

在理解了 precompile 以及他们的地址,我们就可以尝试着来调用他们。我们还是以 sha256 为例子,我们写一个简单的 solidity 合约,代码如下:合约非常简单,首先定义一个地址,然后通过 call 这个函数来调用 sha256 方法,这里可以输入一个 bytes 作为 input,并把它的结果放到链上存贮 result 里面。

// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.2 <0.9.0; contract Storage {    event CallPrecompile(bytes);    bytes result;    function callH256(bytes calldata input) public {        // address of precompile h256        address precompile = address(0x02);        // result        bool success;        bytes memory resultInMemory;        // just call it without selector        (success, resultInMemory) = precompile.call{value: 0}(input);        // emit the result        if (success) {            emit CallPrecompile(resultInMemory);        }        // put result in storage        result = resultInMemory;    }}

我们打开 polkaVM 的 remix,在浏览器中输入 https://remix.polkadot.io 

把这个合约加到一个源文件中,并编译和部署。得到地址后,调用 callH256 函数,测试数据可以从这个文件(🔗 https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/revive/src/pure_precompiles/testdata/2-sha256.json)得到, 里面包含输入和输出的正确结果。 

运行结果截图如下:

图片

03

使用和扩展

本文简单的介绍了 revive 里面 precompile 具体实现和使用方法,大家可以关注 precompile 的变化,可能会包含你所需要的功能,这样就可以直接使用了,不需要自己在去实现。

如果你是在自己的链上引入了 revive,也可以根据需要自己添加 precompile 合约,把需要的 runtime 里面的功能暴露给智能合约来调用,或者将常用的算法,函数放在 precompile,提高运行效率,减少合约大小。

免责声明:由 PaperMoon 提供并包含在本文中的材料仅用于学习目的。它们不构成财务或投资建议,也不应被解读为任何商业决策的指导。我们建议读者在做出任何投资或商业相关的决定之前,进行独立研究并咨询专业人士。PaperMoon 对根据本文内容采取的任何行动不承担任何责任。

http://www.dtcms.com/wzjs/807855.html

相关文章:

  • 国内wordpress大牛网站优化公司电话
  • 体育网站建设方案godaddy上传网站
  • 北京梦创义网站建设建站seo怎么赚钱
  • 临沧网站制作昌平区事业单位公共知识培训网站
  • 网站设计网页设计公司杭州企业网站设计
  • 杭州住房建设部官方网站外包加工网官网下载app
  • 山大优秀网站建设2018年度卓天商务跨境电商
  • 长春火车站建在哪里电子工程网 ofweek
  • 涪城网站建设网站建设公司 青岛
  • 网站建设需要什么硬件和软件有哪些方面如何加强精神文明网站建设内容
  • 网站备案查询不到网站关键词优化互点
  • 广州电子商务网站建设 vwordpress柚子皮5.31
  • 网站快速排名技术国内优秀app界面设计案例
  • 东营市建设局网站wordpress主题常规选项修改不
  • 网站下载工具阳江网页设计培训试听
  • 网站改版的影响wordpress地址更改
  • 上海网站建设定做外贸需要关注国外哪些网站
  • 网站的二级栏目怎么做顺企网官网登录入口
  • iis7配置asp.net网站it运维方案
  • 织梦资源下载站网站模板创意设计网站推荐
  • 一个网站平台建设得多少钱中国建设银行官网个人网上银行登录
  • 江门网站建设自助建站wordpress tag 中文
  • 做网站的目标是什么外贸平台网站建设
  • 企业做网站的困惑上海专业网站建设排行
  • 在网站建设中经历的流程网店装修教程免费
  • 易书网上书城网站建设方案网站内建设的发展
  • 好看的网站设计网站石家庄有什么做网站的公司
  • 百度推广官网网站网站备案域名怎么买
  • 县直门户网站建设管理南宁网站seo外包
  • 静态网站开发语言有哪些网站无法被百度收录