我有一个带有以太坊事务和相关内部执行调用的数据框架.数据如下所示:
[
{
"BLOCK": 12003477,
"TIMESTAMP": "2021-03-09 09:21:58.000",
"TX_HASH": "0x78fb79172b623efeebcc07d5dbf734e40890e56e8d3783ffc82b24618682f594",
"CALL_ID": "\\N",
"CALL_TYPE": "call",
"FROM_ADDRESS": "0x45ae5ae57a0f4e6250f782fc6f0daec5dead27e4",
"TO_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"FUNCTION_NAME": "createEstateWithMetadata",
"ORDER_INDEX": 3859
},
{
"BLOCK": 12003477,
"TIMESTAMP": "2021-03-09 09:21:58.000",
"TX_HASH": "0x78fb79172b623efeebcc07d5dbf734e40890e56e8d3783ffc82b24618682f594",
"CALL_ID": "0",
"CALL_TYPE": "delegatecall",
"FROM_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"TO_ADDRESS": "0xa57e126b341b18c262ad25b86bb4f65b5e2ade45",
"FUNCTION_NAME": "createEstateWithMetadata",
"ORDER_INDEX": 3861
},
{
"BLOCK": 12003477,
"TIMESTAMP": "2021-03-09 09:21:58.000",
"TX_HASH": "0x78fb79172b623efeebcc07d5dbf734e40890e56e8d3783ffc82b24618682f594",
"CALL_ID": "0_0",
"CALL_TYPE": "call",
"FROM_ADDRESS": "0xa57e126b341b18c262ad25b86bb4f65b5e2ade45",
"TO_ADDRESS": "0x959e104e1a4db6317fa58f8295f586e1a978c297",
"FUNCTION_NAME": "mint",
"ORDER_INDEX": 3863
},
{
"BLOCK": 12003477,
"TIMESTAMP": "2021-03-09 09:21:58.000",
"TX_HASH": "0x78fb79172b623efeebcc07d5dbf734e40890e56e8d3783ffc82b24618682f594",
"CALL_ID": "0_0_0",
"CALL_TYPE": "delegatecall",
"FROM_ADDRESS": "0x959e104e1a4db6317fa58f8295f586e1a978c297",
"TO_ADDRESS": "0x1784ef41af86e97f8d28afe95b573a24aeda966e",
"FUNCTION_NAME": "mint",
"ORDER_INDEX": 3866
},
{
"BLOCK": 12019039,
"TIMESTAMP": "2021-03-11 19:03:09.000",
"TX_HASH": "0xdabadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712b",
"CALL_ID": "\\N",
"CALL_TYPE": "call",
"FROM_ADDRESS": "0x3b38a52998a4b786638e774007f3f8ab34db792e",
"TO_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"FUNCTION_NAME": "setApprovalForAll",
"ORDER_INDEX": 1620
},
{
"BLOCK": 12019039,
"TIMESTAMP": "2021-03-11 19:03:09.000",
"TX_HASH": "0xdabadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712b",
"CALL_ID": "0",
"CALL_TYPE": "delegatecall",
"FROM_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"TO_ADDRESS": "0xa57e126b341b18c262ad25b86bb4f65b5e2ade45",
"FUNCTION_NAME": "approve",
"ORDER_INDEX": 1622
},
{
"BLOCK": 12019039,
"TIMESTAMP": "2021-03-12 20:08:20.000",
"TX_HASH": "0xbcbadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712c",
"CALL_ID": "\\N",
"CALL_TYPE": "call",
"FROM_ADDRESS": "0x3b38a52998a4b786638e774007f3f8ab34db792e",
"TO_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"FUNCTION_NAME": "setApprovalForAll",
"ORDER_INDEX": 1620
},
{
"BLOCK": 12019039,
"TIMESTAMP": "2021-03-12 20:08:20.000",
"TX_HASH": "0xbcbadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712c",
"CALL_ID": "0",
"CALL_TYPE": "delegatecall",
"FROM_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"TO_ADDRESS": "0xa57e126b341b18c262ad25b86bb4f65b5e2ade45",
"FUNCTION_NAME": "approve",
"ORDER_INDEX": 1622
}
]
具有相同TX_HASH
值的记录属于相同的执行轨迹.其中,CALL_ID = \\N
代表事务(etherscan),其他代表内部调用.在内部调用记录上,CALL_ID
字段可以获得0
、0_0
、0_1
、0_0_0
、0_1_0
等值...下划线后的每个数字表示执行跟踪中的更深层次.\\N
号记录为实际交易,其他记录表示智能合约在执行期间内部执行的功能.
在数据框架内,有数千个不同的事务,因此有数千个不同的TX_HASH
个值.对于每个不同的哈希值,可以有1个或多个表示内部调用的记录.
此外,从数据示例中可以看到,还有一个FUNCTION_NAME
表示智能合约执行的功能.\\N
表示顶层功能,0
、0_0
表示内部功能.
我需要做的是 for each 顶级FUNCTION_NAME
创建不同的数据帧,这意味着在CALL_ID = \\N
的记录上每个不同的FUNCTION_NAME
值.考虑到上面的createEstateWithMetadata
,应该有一个包含FUNCTION_NAME = createEstateWithMetadata
和CALL_ID = \\N
记录的数据帧,然后考虑到这些记录的哈希,我们需要识别内部调用(它们具有相同的哈希),并将它们添加到数据帧中.
例如,createEstateWithMetadata
的数据框应该包含上面的数据样本中包含的记录.在初始数据帧中,FUNCTION_NAME
和CALL_ID = \\N
有20多个不同的值.下面的setApprovalForAll
是一个示例,它将导致一个新的数据帧:
{
"BLOCK": 12019039,
"TIMESTAMP": "2021-03-11 19:03:09.000",
"TX_HASH": "0xdabadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712b",
"CALL_ID": "\\N",
"CALL_TYPE": "call",
"FROM_ADDRESS": "0x3b38a52998a4b786638e774007f3f8ab34db792e",
"TO_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"FUNCTION_NAME": "setApprovalForAll",
"ORDER_INDEX": 1620
},
{
"BLOCK": 12019039,
"TIMESTAMP": "2021-03-11 19:03:09.000",
"TX_HASH": "0xdabadcba08961d6fdffbdee0a5f801dd59c098b65c41087d95a608065ade712b",
"CALL_ID": "0",
"CALL_TYPE": "delegatecall",
"FROM_ADDRESS": "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d",
"TO_ADDRESS": "0xa57e126b341b18c262ad25b86bb4f65b5e2ade45",
"FUNCTION_NAME": "approve",
"ORDER_INDEX": 1622
}
我的 idea 是先按TX_HASH
分组以获得执行的"跟踪",然后获得每组第一条记录的FUNCTION_NAME
值(应该是CALL_ID = \\N
),以创建数据帧,并迭代地将每个组放入正确的数据帧中.我相信这可能是解决办法.