Solidity
web3 返回 0x000000000000000000000000000000000000000001 作為地址
我正在嘗試使用 MetaMask 和 web3.js 在智能合約中創建資產:
contract AssetTracker { struct Asset { string name; string description; string manufacturer; uint price; uint id; address owner; bool initialized; } Asset[] public assets; mapping(address => mapping(uint => bool)) public walletStore; function createAsset(string _name, string _description, string _manufacture, uint _price, uint id) public { Asset memory newAsset = Asset(_name, _description, _manufacture, _price, id, msg.sender, true); assets.push(newAsset); walletStore[msg.sender][id] = true; } }
我檢索創建的資產並將它們全部呈現為表:
const assets = await Promise.all( Array(parseInt(assetCount)) .fill() .map((element, index) => { return tracker.methods.assets(index).call(); }) ); renderRows() { return this.props.assets.map((asset, index) => { return ( <AssetRow key={index} id={index} asset={asset} /> ); }); }
問題是地址顯示不正確。它們就像 0x00000000000000000000000000000000000000001 或 0x0000000000000000000000000000000000000007。
創建資產的賬戶將成為該資產的所有者。因此,在 createAsset 函式中,我將 msg.sender 作為所有者,我猜根據此連結導致了問題。但是,連結中的解決方案對我的情況沒有用。有人可以幫我解決問題嗎?正確顯示 MetaMask 中的地址。
有可能這是開發問題,您可以在特定網路上與舊版本的智能合約進行通信。確保您使用正確的網路、正確的合約地址,或者您可以重新編譯、部署最新版本的合約並嘗試新的合約。
您是否獲得了具有正確索引的儲存資產?因為對混音和松露都進行了測試
此外,用松露進行測試也有效
const Manager = artifacts.require('AssetTracker'); contract('asset manager', () => { it('works', async () => { let instance = await Manager.deployed(); await instance.createAsset("asset1", "house", "bob builder", 123, 0); await instance.createAsset("asset2", "house", "bob builder", 123, 1); await instance.createAsset("asset3", "house", "bob builder", 123, 2); const stored_assets = "3"; const assets = await Promise.all( Array(parseInt(stored_assets)) .fill() .map((element, index) => { return instance.assets(index); }) ); console.log(assets); }) })