Solidity

操作碼 LOG3 數據值問題

  • April 25, 2022

我正在嘗試從 LOG3 獲取事件數據,但數據有時在 stack5 上,有時在 stack6 上,有人可以幫忙嗎?

例如,兩個傳輸函式的傳輸量 = 1,請查看 LOG3 操作碼堆棧。

event Transfer(address indexed from, address indexed to, uint256 value);


function transfer1(address to, uint tokens) public returns (bool success) {
   emit Transfer(msg.sender, to, tokens);
   return true;
}

function transfer2() public returns (bool success){
   uint256 amount = 1;
   emit Transfer(msg.sender, msg.sender, amount);
   return true;
}

Transfer1 的 LOG3 Struct Log 的位置 5 處的 Transfer Amount 數據:

$$ “0x0000000000000000000000000000000000000000000000000000000000000080”, “0x0000000000000000000000000000000000000000000000000000000000000020”, “0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef”, “0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4”, “0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4”, “0x0000000000000000000000000000000000000000000000000000000000000001”, “0x000000000000000000000000000000000000000000000000000000000000004e”, “0x000000000000000000000000000000000000000000000000000000002e687de1” $$ Transfer2 的 LOG3 Struct Log 的位置 6 處的 Transfer Amount 數據:

$$ “0x0000000000000000000000000000000000000000000000000000000000000080”, “0x0000000000000000000000000000000000000000000000000000000000000020”, “0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef”, “0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4”, “0x000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c”, “0x0000000000000000000000000000000000000000000000000000000000000000”, “0x0000000000000000000000000000000000000000000000000000000000000001”, “0x000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c”, “0x000000000000000000000000000000000000000000000000000000000000006a”, “0x00000000000000000000000000000000000000000000000000000000a9059cbb” $$ 我怎麼知道該採取什麼立場?謝謝。

好的,所以我想我現在了解您的問題,這不是可靠性問題,在我看來,您在這兩個執行點誤解了堆棧。

LOG3操作碼(和一般的LOGX)從堆棧中獲取以下輸入:

  • 0x00 - 偏移:在數據的記憶體中)
  • 0x20 - LENGTH:在數據的記憶體中)
  • 0x40 - 主題 0:keccak256(“傳輸(地址,地址,uint256)”)
  • 0x60 - 主題 1:索引地址
  • 0x80 - 主題 2:索引到的地址

因此,此時只有堆棧中的前 5 個插槽與您相關,其他任何內容都與執行的其餘部分有關,但與 LOGX 操作碼無關。

您將在 MEMORY 找到其餘數據(值)

$$ OFFSET:OFFSET + LENGTH $$實際上,在這兩種情況下,值1都被編碼為 32 個字節。 索引參數放在主題部分,非索引參數放在數據部分中,因此from包含to在主題部分(堆棧3和4)中,value而是唯一寫入數據部分的參數,這就是記憶體長度的原因只有 0x20(只有一個 ABI 編碼參數)。

我希望這能回答你的問題。

引用自:https://ethereum.stackexchange.com/questions/126817