我们正在使用图形协议运行安全索引服务,并且正在索引自块17265698以来在gnosis链中创建的所有安全(这对我们的特殊需求是有意义的)。作为其中的一部分,我们在块上执行一个eth_call,即创建保险箱是为了找出它的所有者(以及侦听所有者更改事件,以便在我们的子图中更新保险箱的所有者)。我们遇到了一个非常不寻常的情况,在gnosis链上有一个特定的安全,0x3af12EcC0A8Ef31cc935E0B25ea445249207d21A是在块21735473中的transaction 0xbd72451723d4a9cc3a039db3501ac105b3eba0f1deb4d4efb9ffd7c3408b6d83中创建的,如果在它上调用getOwners(),它将恢复。我们非常困惑为什么会发生这种情况,因为getOwners()不包含require()。在这个保险箱创建后的许多块中,有一个随后的事务来为这个安全分配所有者,因此在最新的块中,调用getOwners()不再恢复。但是,在建立索引时,我们的子图在创建时为每个新的保险箱的所有者查询一个新的保险箱,所以我们有一个谁拥有保险箱的历史记录。在gnosis链上调用getOwners() at块21735473时遇到的还原破坏了子图的索引过程。你能帮我们弄清楚为什么会发生这种事吗?看起来这个保险柜一开始没有任何主人。这是一种非常不寻常的情况,但是在没有所有者的保险柜上调用getOwners()不应该导致恢复,对吗?
使用gnosis链存档节点,您可以在这里看到以下内容:(0x14BA831是21735473)
POST https://xdai-archive-df.xdaichain.com/
{
"jsonrpc": "2.0",
"method": "eth_call",
"params": [{
"to": "0x3af12EcC0A8Ef31cc935E0B25ea445249207d21A",
"data": "0xa0e67e2b"
}, "0x14BA831"],
"id": 1
}返回
{
"jsonrpc": "2.0",
"error": {
"code": -32015,
"message": "VM execution error.",
"data": "Reverted 0x"
},
"id": 1
}如果您使用最新的块,您可以看到它的工作,如果您使用一个块之前,您可以看到契约还不存在。但是由于某种原因,在块21735473和21738156之间,这个调用会恢复。值得注意的是,这确实发生在最近的Gnosis连锁硬叉子之后几百个街区--也许是相关的?
知道这里可能发生了什么事吗?在Gnosis安全合同中是否有一个漏洞可能导致了这种情况?
发布于 2022-04-22 10:16:50
setup直到块21738156:https://blockscout.com/xdai/mainnet/tx/0xdf352729d9ecc1ae13d0beda603bfdb7edc2c2304268e3fecbf101630a558e79才被调用,这样getOwners()就会失败。
https://ethereum.stackexchange.com/questions/126648
复制相似问题