IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 面向开发人员的 Solidity:使用Solidity进行ABI编码和解码 -> 正文阅读

[区块链]面向开发人员的 Solidity:使用Solidity进行ABI编码和解码

面向开发人员的 Solidity:使用Solidity进行ABI编码和解码

未标题-3

img

智能合约基本上由状态变量和函数组成。有些函数是私有的,只能从合约内部访问,但许多函数是公共的,可以从合约外部访问。也就是说,应用程序(和人)可以向合约发送数据并从合约中检索数据。

要将数据发送到合约,我们需要以合约可以读取的方式发送数据。也就是说,它们需要被编码。如何执行这种编码的规则由以太坊虚拟机(EVM)的实现定义。

在本文中,我们将学习一些关于编码规则的知识,以及如何使用solidity对必须作为函数参数发送的数据进行编码和解码。

使用abi.encode()对函数的参数进行编码

Solidity有一个名为abi的全局变量,它有一个encode方法,因此我们可以使用它对任何函数的参数进行编码。让我们从一个简单的例子开始。假设我们有下面这个函数

function myFunction(address _myAddress, uint _myNumber)…

我们只对函数的参数进行编码,即地址和整数。我们可以使用 remix 来创建一个执行此操作的函数。

img

部署这个合约,并使用以下地址和无符号整数的值调用函数encode(…):(0x5b38da6a701c568545dcfcb03fcb875f56bedddc4, 127),我们得到了结果

0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4000000000000000000000000000000000000000000000000000000000000007f

对结果的快速分析显示,它有64个字节。这是因为编码是以32字节的倍数进行的:

0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4
000000000000000000000000000000000000000000000000000000000000007f

前32个字节包含地址(20个字节),其余32个字节包含整数7f。编码总是十六进制,十六进制的7f是127。

使用abi.decode()解码函数的参数

现在让我们使用Solidity来解码函数的参数。注意,没有必要识别我们正在处理的函数,因为它的签名将在编码参数之前。为了使问题更加复杂,让我们使用动态变量作为参数。

让我们使用以下合约来解码一组值:string、uint和string。

contract Encode {function encode(string memory _string1, uint _uint, string memory _string2) public pure returns (bytes memory) {
        return (abi.encode(_string1, _uint, _string2));
    }function decode(bytes memory data) public pure returns (string memory _str1, uint _number, string memory _str2) {
        (_str1, _number, _str2) = abi.decode(data, (string, uint, string));            
    }}

部署,然后使用以下参数(Jo?o,3,Paulo)调用函数encode(…),我们有以下返回:

0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000054a6fc3a36f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055061756c6f000000000000000000000000000000000000000000000000000000

我们可能期望返回96个字节(3 x 32),因为我们有3个变量。但是,这3个变量中有2个是动态的,对动态变量的编码就没那么简单了。让我把上面的值分解成32字节的数据块。

0000000000000000000000000000000000000000000000000000000000000060
0000000000000000000000000000000000000000000000000000000000000003
00000000000000000000000000000000000000000000000000000000000000a0
0000000000000000000000000000000000000000000000000000000000000005
4a6fc3a36f000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000005
5061756c6f000000000000000000000000000000000000000000000000000000

我将快速解释一下字符串的编码是如何完成的。第一行指向第一个变量,第二行指向第二个变量,第三行指向第三个变量。因为第二个变量的类型是value,所以我们可以直接在第二行检索它的值3。

对于变量类型字符串,第一行包含的数据是关于第一个字符串的信息。在本例中,十六进制数据为60,十进制数据为96。但这意味着什么呢?这意味着第一个字符串的信息是在从数据开始的96个字节之后找到的。

在92字节之后,32字节的块有一个数字:5。这是字符串所占用的字节数,从下一行开始,以utf-8编码:4a6fc3a36f。从十六进制转换为 UTF-8,我们检索到单词“Jo?o”。

按照相同的模式,可以检索a0字节之后的第三个字符串,也就是从数据开始的160字节之后的字符串。它说它也有5个字节,它的值是5061756c6f, 是 ‘Paulo’ 的 UTF-8 编码。

现在,我们已经看到了如何手动完成此操作,现在看看如何通过solidity来完成此操作。使用我们在合约中写的函数decode(bytes memory data),可以检索编码后的信息:

img

还可以使用其他库对变量进行编码和解码,比如web3.eth.abi。目前也有一个在线网站可以用于此,abi.hashex.org/。

Source:https://medium.com/coinmonks/abi-encode-and-decode-using-solidity-2d372a03e110

关于

ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。

Layer 2道友 - 欢迎对Layer 2感兴趣的区块链技术爱好者、研究分析人与Gavin(微信: chinadefi)联系,共同探讨Layer 2带来的落地机遇。敬请关注我们的微信公众号 “去中心化金融社区”

img

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章           查看所有文章
加:2022-03-24 00:37:21  更:2022-03-24 00:37:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:16:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码