博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以太坊系列之一: 以太坊RLP用法-以太坊源码学习
阅读量:5272 次
发布时间:2019-06-14

本文共 1454 字,大约阅读时间需要 4 分钟。

(递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式。RLP的唯一目标就是解决结构体的编码问题;对原子数据类型(比如,字符串,整数型,浮点型)的编码则交给更高层的协议;以太坊中要求数字必须是一个大端字节序的、没有零占位的存储的格式(也就是说,一个整数0和一个空数组是等同的)。

如果想学习go语言中的反射用法,这个包里面倒是有比较完善的学习示例,感兴趣的可以看看.下面是我写的一个使用示例,演示如何使用rlp这个包.
/*rlp包用法rlp目的是可以将常用的数据结构,uint,string,[]byte,struct,slice,array,big.int等序列化以及反序列化.要注意的是rlp特别不支持有符号数的序列化具体用法见下*///编码type TestRlpStruct struct {    A      uint    B      string    C      []byte    BigInt *big.Int}//rlp用法func TestRlp(t *testing.T) {    //1.将一个整数数组序列化    arrdata, err := rlp.EncodeToBytes([]uint{32, 28})    fmt.Printf("unuse err:%v\n", err)    //fmt.Sprintf("data=%s,err=%v", hex.EncodeToString(arrdata), err)    //2.将数组反序列化    var intarray []uint    err = rlp.DecodeBytes(arrdata, &intarray)    //intarray 应为{32,28}    fmt.Printf("intarray=%v\n", intarray)    //3.将一个布尔变量序列化到一个writer中    writer := new(bytes.Buffer)    err = rlp.Encode(writer, true)    //fmt.Sprintf("data=%s,err=%v",hex.EncodeToString(writer.Bytes()),err)    //4.将一个布尔变量反序列化    var b bool    err = rlp.DecodeBytes(writer.Bytes(), &b)    //b:true    fmt.Printf("b=%v\n", b)    //5.将任意一个struct序列化    //将一个struct序列化到reader中    _, r, err := rlp.EncodeToReader(TestRlpStruct{3, "44", []byte{0x12, 0x32}, big.NewInt(32)})    var teststruct TestRlpStruct    err = rlp.Decode(r, &teststruct)    //{A:0x3, B:"44", C:[]uint8{0x12, 0x32}, BigInt:32}    fmt.Printf("teststruct=%#v\n", teststruct)}

转载于:https://www.cnblogs.com/baizx/p/6928622.html

你可能感兴趣的文章
移动、尺寸改变
查看>>
微信智能开放平台
查看>>
c# 文件笔记
查看>>
第一页 - 工具的使用(webstorm)
查看>>
类和结构
查看>>
CSS3选择器(二)之属性选择器
查看>>
adidas crazylight 2018 performance analysis review
查看>>
typeset shell 用法
查看>>
python 之 循环语句
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
[转]ceph网络通信模块_以monitor模块为例
查看>>
HDOJ 1754 I Hate It(线段树基本操作)
查看>>
latex tree
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
css3学习01
查看>>
【USACO】 奶牛会展
查看>>
继承和多态
查看>>
Dijkstra+计算几何 POJ 2502 Subway
查看>>
修复IE不能执行JS的方法
查看>>