Logs[0].Data 怎么解析


请问reeipt 中的 Logs[0].Data 怎么解析

这是一笔奖励领取的交易,交易 hash0xf50408d6f100fb2b135fb0e1ff202e78c21f3b3430ca63b6abfba3e08420dd7d
这只是一个例子,其实我更想知道的是怎么判断一笔交易是什么类型(转账交易已经知晓),是怎么判断的,根据哪些字段。这些数据是怎么解码的

请问go的sdk有文档链接吗?

同时,希望能出一个比较详细的文档,而不是问题一个个问,一个个去试。platon 测试网到现在也进行了一段时间了,开发社区也应该活跃起来
同求 go-sdk 版本以及文档

下面这个是单元测试用例,其中交易hash为:0xf50408d6f100fb2b135fb0e1ff202e78c21f3b3430ca63b6abfba3e08420dd7d,rlpData为Logs[0].Data值:

type NodeDelegateReward struct {
NodeID discover.NodeID json:"nodeID"
StakingNum uint64 json:"stakingNum"
Reward *big.Int json:"reward" rlp:"nil"
}

func Test(t *testing.T) {
rlpData := “0xf8a030b89df89bf847b840511ab9921b1ecf4bd8c76193a1c281f57a03190eae5418a23a7920a8064f89b9022bfae56d7fd2e740c2bc90c07e7aa78f201fa19c8b2b6e0dd15d8c97bec8c68302535380f850b840511ab9921b1ecf4bd8c76193a1c281f57a03190eae5418a23a7920a8064f89b9022bfae56d7fd2e740c2bc90c07e7aa78f201fa19c8b2b6e0dd15d8c97bec8c683276bb1890185bef91fa0c79618”
v, err := hexutil.Decode(rlpData)
if err != nil {
t.Error(err)
return
}
var m [][]byte
if err := rlp.DecodeBytes(v, &m); err != nil {
t.Error(err)
return
}
if string(m[0]) != “0” {
t.Errorf(“code must same%v”, string(m[0]))
return
}
var res []NodeDelegateReward

if err := rlp.DecodeBytes(m[1], &res); err != nil {
	t.Error(err)
	return
}
fmt.Printf("%v\n", res)

}

1 个赞

目前还没有go sdk哈

是的,谢谢您的建议。

这里有个问题,这个 NodeDelegaetReward 数据类型是哪里定义的?是怎么进行定义的。除了这个交易,还有其他交易类型,比如取回质押,增加质押,版本声明,发起提案,这些是怎么区分的,又是怎么解析的呢?

NewClient方法是在哪看到的?

可通过getTransaction获取交易的入参(input),然后解析出接口号,根据接口文档,可知道对应的是什么交易

可在PlatON的代码仓库中进行全局搜索,代码仓库:https://github.com/PlatONnetwork/PlatON-Go.git


解析一个交易,是怎么对这个交易类型进行区分的呢

这个是自己封装的,在源码中位置在 src/github.com/PlatONnetwork/PlatON-Go/ethclient

1 个赞


那我获取到了这个 input,是一个二进制数组,要怎么解析出来呢?是用了什么编码呢?直接转成 string,乱码

解析方法如下:
func TestParseInput(t *testing.T) {
data := “0xc483821388”
if len(data) >= 2 && data[0:2] == “0x” {
data = data[2:]
}

input := common.Hex2Bytes(data)
var args [][]byte
if err := rlp.Decode(bytes.NewReader(input), &args); nil != err {
	t.Error(err)
	return
}

// 经济模型参数
fnCode := byteutil.BytesToUint16(args[0])

fmt.Printf("fnType:%v\n", fnCode)

}