Solidity
使用 Foundry 檢查映射的值
為了進行測試,我在 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。