Solidity

使用 Foundry 檢查映射的值

  • October 25, 2022

為了進行測試,我在 anvil 上本地部署了我的合約,並嘗試使用 cast 與之互動。為了驗證我的契約的正確工作,我想在更新它們後檢查映射中的值。我想我應該使用cast index. 我目前的做法:

  • 通過執行啟動鐵砧anvil。將第一個錢包的地址和私鑰複製到export WALLET_1=0x...&export PRIVATE_KEY_1=0x...
  • 部署:forge script script/Contract.s.sol:ContractScript --fork-url http://localhost:8545 --private-key $PRIVATE_KEY_1 --broadcast。生成的合約地址進入export CONTRACT_ADDRESS=0x...
  • 發布消息:cast send $CONTRACT_ADDRESS "addKVpair(bytes32, uint)" 0x1 10 --private-key $PRIVATE_KEY_1 --from $WALLET_1
  • 讀取鍵映射:cast index bytes32 0x1 0。我認為插槽號應該是0因為它是第一個聲明的變數。
  • 結果:0x14184318b4299964f96ff8dfa1db97fc8a28d66e8c4434c0773f43adc6062152不是 10。
  • 如果我嘗試讀取非退出鍵的值,我會得到一個類似的非零值。

出了什麼問題?最好的方法是什麼?

作為參考,我的契約是:

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.0 <0.9.0;

contract Contract {
   mapping (bytes32 => uint) public mapTest;

   function addKVpair(bytes32 key, uint value) public {
       mapTest[key] = value;
   }
}

合約中映射和動態數組的儲存位置可以通過 計算

cast index [key-type] [key-value] [slot]

如果您想知道這個特定插槽上發生了什麼,請使用

cast storage [contract address] [mapping key].

以下是有關如何計算插槽的詳細資訊。

在這種情況下,做

>> cast index bytes32 0x1 0
0xabc..
>> cast storage $CONTRACT_ADDRESS 0xabc..
0x000000000000000000000000000000000000000000000000000000000000000a

這是10。

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