Solidity之abi.encode各编码方法使用

这篇具有很好参考价值的文章主要介绍了Solidity之abi.encode各编码方法使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是智能合约 ABI

ABI = Specification for encoding and decoding

非常精炼的一句话:一套用来编码和解码的规范。 

注意与合约字节码(bytecode)要区分开,字节码只是一串用十六进制数表示的 EVM 操作码。

在 Solidity 文档中描述为: 

Solidity之abi.encode各编码方法使用

 “ABI 是与以太坊生态系统中的合约交互的标准方式。既来自区块链外部,也用于合约之间的交互”。

什么是合约的 JSON ABI

JSON ABI specification for functions
JSON ABI specification for events

合约内部函数和事件的编码规范。 

(1)abi.encodeWithSignature

函数签名:

abi.encodeWithSignature(string memory signature, ...args) returns (bytes memory)

代码示例:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract A {
    function callBTest(
        address _address,
        uint256 _num,
        string memory _message
    ) public returns (bool) {
        (bool success, ) = _address.call(
            abi.encodeWithSignature("test(uint256,string)", _num, _message)
        );
        return success;
    }
}

contract B {
    uint256 public num;
    string public message;

    function test(uint256 _num, string memory _message)
        public
        returns (uint256, string memory)
    {
        num = _num;
        message = _message;
        return (num, message);
    }
}

我们在合约A中通过call的方式,使用内置函数abi.encodeWithSignature对合约B的test函数进行调用。第一个参数为被调用函数的签名(不能包含形参和空格),后面是类似js的剩余参数,给被调用函数传参的(顺序要对应)。

注:test(uint256,string)与test(uint,string)签名哈希是不一样的!

测试:

Solidity之abi.encode各编码方法使用

Solidity之abi.encode各编码方法使用 

(2)abi.encode和abi.encodePacked

bytes4 sig = bytes4(keccak256("test(uint256,string)"));
        bytes memory _bNum = abi.encode(_num);
        bytes memory _bMessage = abi.encode(_message);
        (bool success,) = _address.call(
            abi.encodePacked(sig, _bNum, _bMessage)
        );
        return success;

与上面编码不同的是,这里的函数签名sig是用keccak256算法计算结果取前4个字节得来的,另外其余的参数也都使用abi.encode包装了,最后在统一放入abi.encodePacked函数中(属于非标准编码模式)。

测试过程上同。

(3)abi.encodeWithSelector

 bytes4 sig = bytes4(keccak256("test(uint256,string)"));
        (bool success, ) = _address.call(
            abi.encodeWithSelector(sig, _num, _message)
        );

这种需要函数签名哈希的前4个字节,参数不变,作用相同。

 早在v0.4版本是使用abi.encode(...)函数,不过已废弃了。

测试过程上同。

另外额外一种普通调用其它合约方法的写法:

 B contractB = B(_address);
(uint256 num, string memory message) = contractB.test(_num, _message);
return true;

可能会提示有些变量没有用到,问题不大(或者可以写入event) ,也是能达到同样效果的。

ABI 不仅仅是人类和 EVM之间交互的链接。最重要的是,ABI定义了如何对数据和合约调用进行编码和解码的明确规范。ABI 有助于进一步概念化合约,通过参数列表及其类型可以调用哪些函数以及如何调用。ABI 仅包含有关函数和事件的信息,不包括有关状态变量或修饰符的信息(状态变量定义为public时除外,此时将创建一个全局的getter方法)。

 

参考: Contract ABI Specification — Solidity 0.8.17 documentation

            https://coinsbench.com/solidity-tutorial-all-about-abi-46da8b517e7 文章来源地址https://www.toymoban.com/news/detail-411992.html

到了这里,关于Solidity之abi.encode各编码方法使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 优先编码器 Priority Encoder

    优先编码器(Priority Encoder,PENC)用于判断数据最高位1出现的位置。 以 4-2优先编码器(PENC)为例,其真值表为: D3 D2 D1 D0 Q1 Q2 Vld 0 0 0 1 0 0 1 0 0 1 x 0 1 1 0 1 x x 1 0 1 1 x x x 1 1 1 0 0 0 0 x x 0 用卡诺图表示为                  Q0=D3+(~D2)D1                           

    2023年04月08日
    浏览(52)
  • transformer学习笔记:Positional Encoding(位置编码)

    对于任何一门语言,单词在句子中的位置以及排列顺序是非常重要的,它们不仅是一个句子的语法结构的组成部分,更是表达语义的重要概念。一个单词在句子的位置或排列顺序不同,可能整个句子的意思就发生了偏差。举个例子来说: I  do not  like the story of the movie, but I 

    2023年04月08日
    浏览(52)
  • Python encode()函数详解,Python编码解码

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 encode() 可以对字符串进行 「编码」 ,常用来对 「中文」 字符串进行编码,以解决 「乱码」 问题。 语法 参数

    2024年02月13日
    浏览(33)
  • 自编码器(Auto-Encoder)

    自编码器算法属于自监督学习范畴,如果算法把x作为监督信号来学习,这里算法称为自监督学习(Self-supervised Learning) 在监督学习中神经网络的功能:。是输入的特征向量长度,是网络输出的向量长度。对于分类问题, 网络模型通过把长度为 输入特征向量𝒙变换到长度为 的

    2023年04月08日
    浏览(36)
  • 解决JDK URLEncoder.encode 编码空格变 + 号

    使用jdk提供的 URLEncoder 工具类 1.使用spring提供的 UriUtils 工具类 2.使用hutool提供的 URLUtil 工具类

    2024年02月04日
    浏览(24)
  • System.Text.Encoding不同字符编码之间进行转换

    System.Text.Encoding 是 C# 中用于处理字符编码和字符串与字节之间转换的类。它提供了各种静态方法和属性, 用于在不同字符编码之间进行转换 ,以及将字符串转换为字节数组或反之。 在处理多语言文本、文件、网络通信以及其他字符数据的场景中,使用 Encoding 类可以确保数

    2024年02月12日
    浏览(38)
  • 深入理解深度学习——Transformer:编码器(Encoder)部分

    分类目录:《深入理解深度学习》总目录 相关文章: ·注意力机制(AttentionMechanism):基础知识 ·注意力机制(AttentionMechanism):注意力汇聚与Nadaraya-Watson核回归 ·注意力机制(AttentionMechanism):注意力评分函数(AttentionScoringFunction) ·注意力机制(AttentionMechanism):Bahda

    2024年02月08日
    浏览(59)
  • 机器学习:自动编码器Auto-encoder

    不用标注数据就能学习的任务,比如Bert之类的。但最早的方法是Auto-encoder。 encoder输出的向量,被decoder还原的图片,让输出的图片与输入的图片越接近越好。 将原始的高维向量变成低维向量,将该新的特征用于下游任务。 相关的类似方法: PCA: youtu.be/iwh5o_M4BNU t-SNE: yout

    2024年02月14日
    浏览(49)
  • 概念解析 | 神经网络中的位置编码(Positional Encoding)

    注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Positional Encoding A Gentle Introduction to Positional Encoding in Transformer Models, Part 1 在自然语言处理任务中,序列的顺序信息非常重要。例如,“小明去公园玩球”和“小明玩球去公园”

    2024年02月05日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包