首页 > 解决方案 > Solidity 映射返回空值

问题描述

所以基本上,我在智能合约中创建了一个映射来存储用户数据的哈希值。它从用户 ID 映射到哈希本身(一个 bytes32 值)。我使用双 sha256 哈希并将其存储在具有上述 id 的映射中。用于存储它的函数通过返回映射中 id 处的值来返回哈希。这个哈希是正确的,这意味着至少它最初是正确存储的。但是,我有另一个从 id 获取哈希的函数,它在 javascript 测试中总是返回一个空值。我想知道这是测试的问题还是合同本身的问题。

pragma solidity ^0.4.22;
contract UserStore {
    mapping(uint => bytes32) UserHashes; //User id to hash

    event HashStored (
        uint id,
        bytes32 original, 
        bytes32 hash
    );


    function HashData(bytes32 data) returns (bytes32){
        return sha256(abi.encodePacked(sha256(abi.encodePacked(data))));
    }


    function StoreHash(uint user_id,  bytes32 data) external view returns (bytes32){ 
        UserHashes[user_id] = HashData(data);
        HashStored(user_id, data, UserHashes[user_id]);
        return UserHashes[user_id];
    }

    /*
        Gets the hash from the blockchain.
    */
    function GetHash(uint u_id) view public returns (bytes32){
        return UserHashes[u_id];
    }
}

每次我运行这个测试,GetHash 返回一个 0 值;

contract("Storage_Test", function(accounts) {

    const args = {user_id: 0,
                  data: "This is some security data",
                  group_id : 15,
                  user_ids  : [1,2,3,4,5],
                  num_accounts : 2
    }
    it("Hash Test: Multiple Storage and retrieving", async function() { return 
await UserStore.deployed()
    .then(async function(instance) {
        var temp = args.data;
        var _temp;
        for (i = 1; i < args.num_accounts; i++) {
            _temp = temp;
            temp = await instance.HashData.call(temp);
            //  console.log("Datahash: " + temp);
            result = await instance.StoreHash.call(i, _temp);
            //  console.log("Result:   " + result);
            assert.equal(result, temp, "Hash at " + i + " wasn't returned 
correctly");
        }
        temp = args.data;
        for (i= 1; i < args.num_accounts; i++) {
            temp = await instance.HashData.call(temp);
            result = await instance.GetHash.call(i);
            assert.equal( result, temp, "Hash at " + i + " wasn't stored 
correctly");
        }
    })
    }); 
});

标签: mocha.jssoliditytruffle

解决方案


更改instance.StoreHash.call(...)instance.StoreHash.sendTransaction(...)call()在本地运行函数而不是提交事务。结果是任何状态更改都不会持久化。


推荐阅读