以太坊系列之一: 以太坊RLP用法-以太坊源码学习

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

RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,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)

}
目录
相关文章
|
数据采集 存储 XML
高级网页爬虫开发:Scrapy和BeautifulSoup的深度整合
高级网页爬虫开发:Scrapy和BeautifulSoup的深度整合
|
存储 传感器 编解码
【Camera基础(二)】摄像头驱动原理和开发&&V4L2子系统驱动架构
【Camera基础(二)】摄像头驱动原理和开发&&V4L2子系统驱动架构
|
存储 NoSQL Java
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用合集之如何进行大文件的迁移
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
企业微信api接口调用-企业微信好友收发消息
企业微信api接口调用-企业微信好友收发消息
|
安全 云计算 虚拟化
云上未来:探索云计算的技术变革与应用趋势
云上未来:探索云计算的技术变革与应用趋势
1213 0
|
搜索推荐 前端开发 小程序
计算机java项目|Springboot 智能菜谱推荐系统
计算机java项目|Springboot 智能菜谱推荐系统
475 0
|
存储 数据处理 数据库
关系数据库:关系模式
关系数据库:关系模式
627 4
|
机器学习/深度学习 数据采集 算法
机器学习:升维(Polynomial Regression)
该文介绍了升维的概念,指出在低维度中难以对混合数据进行有效分类,而升维是通过算法将数据投射到高维空间以改善模型性能。文章以多项式回归为例,说明了如何通过升维将非线性关系转换为线性关系,并提供了Python代码示例展示了如何使用`PolynomialFeatures`进行升维。代码结果显示,随着维度增加,模型从欠拟合逐渐过渡到过拟合。
1407 0
|
存储 缓存 Kubernetes
阿里云容器服务助力万兴科技 AIGC 应用加速
阿里云容器服务助力万兴科技 AIGC 应用加速