以太坊系列之一: 以太坊RLP用法-以太坊源碼學習


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)

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM