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 合约,有的是其他合约,所以,要进一步过滤。

获取合约的地址

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

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

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

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

过滤

因为符合 ERC20token 合约,总有 symboldecimalamount 这些属性。

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

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

请我喝杯咖啡吧~