以太坊RLP用法-go-ethereum学习
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)
}
以太坊RLP用法-go-ethereum学习的更多相关文章
- 以太坊系列之一: 以太坊RLP用法-以太坊源码学习
RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...
- 以太坊 layer2: optimism 源码学习(二) 提现原理
作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. 掘金:https://juejin.im/user/1785262612681997 博客:http://www.cnblogs.com/ ...
- 以太坊 layer2: optimism 源码学习 (一)
作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. 掘金:https://juejin.im/user/1785262612681997 博客:http://www.cnblogs.com/ ...
- 以太坊solidity智能合约语言学习资源整理
暂时看到篇文章写的不错,先收集下来,后面有机会自己也整理一个 Solidity语言学习(一)Solidity语言学习(二)——Solidity的安装与编译Solidity语言学习(三)——智能合约编程 ...
- 以太坊智能合约开发 Solidity学习
1. pragma solidity >=0.4.22 <0.6.0;//版本号,头文件 contract BooleanTest { bool _a;//默认返回false int nu ...
- 【以太坊剖析】以太坊虚拟机(EVM)之基本定义
以太坊虚拟机(EVM) 以太坊虚拟机(Ethereum Virtual Machine,简称EVM)是一个基于栈的虚拟机,基于特定的环境数据,执行一系列的字节代码形式的指令,以修改系统状态.EVM目前 ...
- 以太坊客户端Geth命令用法-参数详解
Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具. 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册. 本文主要是对geth help的翻译 ...
- 以太坊客户端Geth命令用法-参数详解【转载】
原文链接:http://www.cnblogs.com/tinyxiong/p/7918706.html Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具.熟悉Get ...
- Geth命令用法-参数详解 and 以太坊源码文件目录
本文是对以太坊客户端geth命令的解析 命令用法 geth [选项] 命令 [命令选项] [参数-] 版本 1.7.3-stable 命令 account 管理账户 attach 启动交互式JavaS ...
随机推荐
- Unity3D 预备知识:C#与Lua相互调用
在使用Unity开发游戏以支持热更新的方案中,使用ULua是比较成熟的一种方案.那么,在使用ULua之前,我们必须先搞清楚,C#与Lua是怎样交互的了? 简单地说,c#调用lua, 是c# 通过Pin ...
- C# 事务之SqlTransaction
private static void Execute(string connectionString) { using (SqlConnection connection = new SqlConn ...
- css伪类的组合用法
利用伪类组合,可以用css代替js以达到目的,少些一下js .textarea:empty:before { display: block; content: '请输入'; color: #ababa ...
- Android -- 贝塞尔实现水波纹动画(划重点!!)
1,昨天看到了一个挺好的ui效果,是使用贝塞尔曲线实现的,就和大家来分享分享,还有,在写博客的时候我经常会把自己在做某种效果时的一些问题给写出来,而不是像很多文章直接就给出了解决方法,这里给大家解释一 ...
- Lucene工作原理
Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构.该结构及相应的生成算法如下: 0)设有两篇文章1和2 文章1的内容为:Tom lives in Guangzhou,I l ...
- MyBatis-plus 代码自动生成器
MyBatis-plus 代码自动生成器 1.添加pom文件依赖 <!-- Mybatis-Plus 自动生成实体类--> <dependency> <groupId& ...
- python基本数据类型——list
一.创建列表: li = [] li = list() name_list = ['alex', 'seven', 'eric'] name_list = list(['alex', 'seven', ...
- [Day03] 循环语句、list相关练习题
用户输入两个数,求平均值. 让用户一直输入数字,如果输入的是'0',终止程序打印所有数字之和. 让用户一直输入数字(只输入数字),如果没输入任何值,终止程序打印所有输入数字的平均值. 求出这个list ...
- hdu2389二分图之Hopcroft Karp算法
You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...
- 1008 Elevator
Problem Description The highest building in our city has only one elevator. A request list is made u ...