0%

doge | 如何获取链上最新部署合约

这里的链针对的是 EVM 链。

得事先声明,我搜索全网资料的时候,并没有发现怎么从区块中获知是创建合约还是啥。

首先,每个人写的创建合约的方法可以是不同的,所以,你无法从单一的方法名字来判断,经过,我多次对比数据,我发现了下面的规律。

我并不知道下面的规律是否能适应所有的情况,如果,你有更好的方法,欢迎留言。

获取初始创建合约

首先,看一下新合约创建的时候的 transaction。

通过直接对接 ETH 的 RPC 获取一整个区块的 transactions.

这里给出一个创建合约的 transaction 的样子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
'accessList': [],
'blockHash': '0x6b2637722f4de7193a65da5df43ae021561fee41cbec5215ff428f34f9ad5a41',
'blockNumber': '0xeabed1',
'chainId': '0x1',
'from': '0xbc9142cc5a7b58d84ede82208648ec95261ef418',
'gas': '0x49bb1d',
'gasPrice': '0x21376a82e',
'hash': '0x24c913f9835b65fc0327c36da355a406bdab880d71a88503c1c6d647c002e0b7',
'input': '0x6000805...', 2_
'maxFeePerGas': '0x35de88458',
'maxPriorityFeePerGas': '0x9502f900',
'nonce': '0x0',
'r': '0xc9ca19b9e327bb3c7f84ee9b2b89ddd2b1c38486ee2966c13fc87631fad17db8',
's': '0x5fd904d8744616490e90634fde450863d1d288ab7148172eaeb4f1a433ef219',
'to': None,
'transactionIndex': '0xc',
'type': '0x2',
'v': '0x1',
'value': '0x0'
}

这里面最重要的就是 to 这个属性,它对应的是 None。

因为,创建合约本来就不知道 to 是什么,所以,其一定是 None。

但是,创建的合约,有的是 token 合约,有的是其他合约,所以,要进一步过滤。

获取合约的地址

因为,上面的 to 是 None,即便是做过滤,你首先也应该知道合约的地址是什么。

通过获取 logs 的话,to 也是 None,但是,观察 logs 的话,你可以发现

第一个 logs 的 address 总是创建的合约地址。

所以,合约地址现在也找到了。

过滤

因为符合 ERC20 的 token 合约,总有 symbol、decimal、amount 这些属性。

所以,只需要检查一下合约有没有这些属性就好了。

经过,这 3 个步骤,大部分新创建的合约就都能捕获了。

请我喝杯咖啡吧~