Code -
pragma solidity ^0.4.18;
contract CA18 {
address public owner;
function CA18 () {
owner = msg.sender;
}
mapping(address=>uint16) public balances;
function getBalance() view returns (uint16, bytes32) {
require(msg.sender == owner);
uint16 mybalance = 1000;
bytes32 c = keccak256(owner);
return (mybalance, c);
}
}
> con.getBalance()
[1000, "0x0679d661b585d1b4f0c3fd18f943f19e7fa9777fe23cb96b94f469c20d6f0bd5"]
> web3.sha3(eth.coinbase)
"0x3ba2c5fae04972f5960bd8d1b7f098bf7d4c844da67accd23da00f62e4910fc0"
> con.owner()
"0x46fb9a22689c4a4bfb494baeafbb8b2993725305"
> web3.sha3(con.owner())
"0x3ba2c5fae04972f5960bd8d1b7f098bf7d4c844da67accd23da00f62e4910fc0"
Web3.sha is not the same as keccak256(owner).
The docs state -
sha3(...) returns (bytes32):
alias to keccak256
The outputs show sha3 to be different keccak256. Should they be the same?
(con is the contract instance.)
I just added sha3 for the owner and here is the output -
> con.getBalance()
[1000, "0x0679d661b585d1b4f0c3fd18f943f19e7fa9777fe23cb96b94f469c20d6f0bd5", "0x0679d661b585d1b4f0c3fd18f943f19e7fa9777fe23cb96b94f469c20d6f0bd5"]
function getBalance() view returns (uint16, bytes32, bytes32) {
require(msg.sender == owner);
uint16 mybalance = 1000;
bytes32 c = keccak256(owner);
bytes32 d = sha3(owner);
return (mybalance, c, d);
}
Hence the difference is due to web3 and solidity. Has anyone any explanation about this since sha3
is used in the addressing algorithms for storage and they work, and they are also based on keccak256
.
sha3
andkeccak256
should be exactly the same. Comparing toweb3.js
'ssha3
, though, will reveal a number of differences.