4

I have a simple Solidity function as below:

function testKeccak(uint8[] buffer) public pure returns (bytes32) {
    return keccak256(abi.encodePacked(buffer));
}

Testing the keccak256 hash using library from: https://github.com/modulexcite/CEX

But they yield different results.

var In = "54686973206973206A75737420612074657374"; // Assume this is a byte[], otherwise the code won't compile
Web3 w = new Web3("http://localhost:8545/");
Contract c = w.Eth.GetContract("My ABI", " My Contract Address");
var r = c.GetFunction("testKeccak").CallAsync<byte[]>(In).Result;

//Expected = 68D0D86DF8DCA7ABDAD4DA5986F7E33FA7637EE85775A64AE965E10E3841923E
//Received = FC3B317A9FB7A02E6FF7A1839EEA04A21C30D9CD15B3414FA7431F09DEEC9D9D

May I know if there is any C# library out there which can get the correct Keccak256 hash when compared to Solidity?

1

3 Answers 3

6

Tested:

using System;
using System.Linq;
using Org.BouncyCastle.Crypto.Digests;

namespace myNamespace
{
    public static class TransactionTool
    {
        public static string GetTransactionHash(string rawTransaction)
        {
            var offset = rawTransaction.StartsWith("0x") ? 2 : 0;

            var txByte = Enumerable.Range(offset, rawTransaction.Length - offset)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(rawTransaction.Substring(x, 2), 16))
                             .ToArray();

            //Note: Not intended for intensive use so we create a new Digest.
            //if digest reuse, prevent concurrent access + call Reset before BlockUpdate
            var digest = new KeccakDigest(256);

            digest.BlockUpdate(txByte, 0, txByte.Length);
            var calculatedHash = new byte[digest.GetByteLength()];
            digest.DoFinal(calculatedHash, 0);

            var transactionHash = BitConverter.ToString(calculatedHash, 0, 32).Replace("-", "").ToLower();

            return transactionHash;
        }
    }
}
1
  • 1
    thank you very much! This code produced the same as Javascript's web3.utils.sha3()
    – Reath
    Feb 15, 2021 at 14:53
0

I found that this C# lib implement keccak256

https://github.com/multiformats/cs-multihash

0

It is likely that there is a padding version mismatch. You can use https://www.nuget.org/packages/SHA3/1.0.0-rc to choose which padding version you'd like, the official SHA3 is now the default. Setting UseKeccakPadding to true enables original Keccak padding.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.