The problem is that sha3 in solidity returns bytes32 and I have a string returned from IPFS by oraclize, and if hash calculated in solidity and returned to web3js (bytes32 got interpreted as a string) it equals web3.utils.soliditySha3, but I can't make that comparison inside solidity because of different types. I tried converting bytes32 to string and vice versa in a few ways each, sometimes it doesn't work, sometimes they are not equal.

    bytes32 checkHash = keccak256(strConcat("0xf17f52151ebef6c7334fad080c5704d77216b732","570000000000000000"));        
    var first = checkHash.toSliceB32();
    var second = form.toSlice();   // Returned from IPFS, it's a string that looks 
        // like "0xd89a3fa2ddbed0a17fa2954b1060f41591c216155b688a7b5af5a2d7c003bb11"
        // checkHash returns the same string when pulling it out by web3js

So, I'm using this (https://github.com/Arachnid/solidity-stringutils) library to convert them both to slices and check by first.equals(second), and they are not equal. I can't convert first slice to string, it says

Error: Invalid UTF-8 detected

I tried function from here (How to convert a bytes32 to string), it says the same, tried

function stringToBytes32(string memory source) public constant returns (bytes32 result) {        
        assembly {
            result := mload(add(source, 32))

from here(https://gist.github.com/ageyev/779797061490f5be64fb02e978feb6ac), it converts it to something else. I guess I have no clue now on how it works.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.