Solidity

web3 返回 0x000000000000000000000000000000000000000001 作為地址

  • November 11, 2018

我正在嘗試使用 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);

   })
})

松露測試結果

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