My suggestion is to use the abi.encode
method in solidity, and the equivalent web3.eth.abi.encodeParameters
in web3.js.
Something like this:
Solidity Source
pragma solidity ^0.4.24;
contract test{
struct mStruct {
string message;
address sender;
uint balance;
}
function testme() public pure returns(bytes32) {
mStruct memory message = mStruct("Receiver closing signature", 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c, 100);
return keccak256(abi.encode(message.message, message.sender, message.balance));
}
}
Result:
0x4006e807f707d49e72276526e1106236184a868f6a142ca286ae0583556bacfb
JavaScript Source
message = {
'message': 'Receiver closing signature',
'sender': '0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c',
'balance': 100
};
encoded = web3.eth.abi.encodeParameters(['string', 'address', 'uint'],[message.message, message.sender, message.balance])
hash = web3.utils.keccak256(encoded)
Result:
"0x4006e807f707d49e72276526e1106236184a868f6a142ca286ae0583556bacfb"
JSON.stringify(message)
instead... – Shawn Tabrizi Oct 8 '18 at 10:16