Pre:
debank是个很好用的产品,比如交易历史功能,相比原生的bscsan的原生记录,debank的展示得更清晰,某笔交易和哪个项目的做了什么交互动作、token的交换记录、gas费用转换成u显示。看着不错,仿照debank的交易历史功能做个小项目练练手。
debank交易历史界面:
有以下功能点:
-
钱包余额总值
-
不同的公链
-
交易时间
-
交易hash
-
与什么合约做了什么交互动作
-
token的传输记录,增加了X Token,减少了X Token
-
gas费用换算成u
项目效果图:
项目地址:bsc_trade_history
功能点:
合约交互记录-重点:
有以下几个点:
-
项目的logo
-
项目名字
-
调用合约的具体函数
合约交互记录-项目logo和名字:
交易记录里,会记录你地址与哪个合约发生了交互
可以知道合约地址,一个项目可以有好几个合约地址,比如PancakeSwap
可以有几个合约地址
-
PancakeSwap: Router v2
-
PancakeSwap: Router v1
-
…
这里主要是要找到合约地址
和项目
的映射关系暂时有几个思路:
-
contract creator
部署项目合约的地址
-
在项目源码找常量,记录了那些项目合约地址
这一块感觉后续要不断去维护这些映射关系
合约交互记录-调用合约的具体函数:
调用bscscan的这个Get a list of 'Normal' Transactions By Address
接口,可以获得以下数据
调用合约的具体函数可以通过解析input_data
得知
如果项目合约是开源验证过的话,可以通过decode_function_input
接得
1 | contract_ins = self.get_token_contract_with_abi(contract_address, contract_abi_json) |
如果项目合约未开源,input_data
的前4个字节是函数原型的Keccak256
哈希,可以调用4byte.directory进行哈希查询,反查出函数名。
transaction里的token传输记录:
要怎么解析出交易里代币的传输记录?
token基本都是符合erc20
标准,都含有标准的Transfer
函数要知道该次交易里token的传输记录,要解析log里的Transfer event
但并不是所有log里,都能看到Transfer
的字眼
有的就没有
由于符合erc20标准的代币的Transfer(address from, address to, uint256 value)
函数是固定的,经过keccak
哈希后,可得到哈希字符串0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
如果该次交易里含有erc20代币的传输,那么就存在含有该哈希的event
.
接下来去解析这些event
就可以知道token的传输记录了
参考:ERC20 Tokens Transferred Information from Transaction Hash
Bug&Todo:
个人地址转账:
如何判断一个地址是合约地址还是个人地址?
How to detect if an address is a contract?
个人地址的转账记录这块还没做对应的解析
SSL error:
[SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decryption failed or bad record mac (_ssl.c:2570)
normal
只用了bscscan的这个Get a list of 'Normal' Transactions By Address
接口,还有一些交易类型没收录进去,仍有欠缺