Von Golang Sha3 zu Solidity Sha3

Der Versuch, die Bibliothek "golang.org/x/crypto/sha3" mit solidity sha3() abzugleichen, bereitet mir Schwierigkeiten. Es wurde hier diskutiert , aber ich kann es irgendwie nicht in Go anwenden. Wie gehe ich mit einem big.Int-Typ um, wenn ich solidity.sha3(uint256(1))==golang.sha3.Sum256(convertMyBigInt(myBigInt)) bekomme?

Ich verwandle das bigInt in ein Hex-Byte-Array, fülle dann die linke Seite mit Nullen, Hash und gebe dann aus.

//create a big int for test and set to 1
b1 := new(big.Int)
b1.SetInt64(1)
//create empty array with 32 bytes for padding
empty := make([]byte,32)
//turn the big int into a hex string (let me know if there is a more 
      //elegant way^^)
String := bytes.NewBufferString(b1.Text(16))
copy(empty[len(empty)-len(String.Bytes()):],String.Bytes())
//output of empty : [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49]
res:= new(big.Int)
temp:=sha3.Sum256(empty)
res.SetBytes(temp[:])   
fmt.Println("\nresult ",res.Text(16))

Ausgabe: 26502030f0954243c70cb7fa68e0752ce2bf99aabfc0219d5184635d4c61dbd8

Solidität gibt mir:

sha3(uint(1))
b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6

kann mir jemand ein kurzes beispiel geben, wie man solidity sha3 auf elegante weise mit golang sha3 abgleicht? Ich wäre sehr dankbar!

Antworten (1)

Hier ist ein voll funktionsfähiges Beispiel zum Generieren von Solidity-Sha3-Hashes aus uint256:

package main

import (
    "fmt"
    "math/big"

    "github.com/ethereum/go-ethereum/accounts/abi"
    "github.com/ethereum/go-ethereum/crypto/sha3"
)

func main() {
    h := sha3.NewKeccak256()
    h.Write(abi.U256(big.NewInt(1)))
    hash := h.Sum(nil)
    fmt.Printf("%x", hash) // b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6
}

Solidität:

sha3(uint(1))
b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6

Ich habe die Bibliothek go-solidity-sha3 erstellt , um Solidity-Typen in Go einfach in Solidity-Sha3-Hashes umwandeln zu können. Hier ist ein Beispiel:

package main

import (
    "fmt"
    "math/big"

    solsha3 "github.com/miguelmota/go-solidity-sha3"
)

func main() {
    hash := solsha3.SoliditySHA3(
        solsha3.Uint256(big.NewInt(1)),
    )
    fmt.Printf("%x", hash) // b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6
}

Ein komplexeres Beispiel:

package main

import (
    "encoding/hex"
    "fmt"
    "math/big"

    "github.com/miguelmota/go-solidity-sha3"
)

func main() {
    hash := solsha3.SoliditySHA3(
        solsha3.Address("0x12459c951127e0c374ff9105dda097662a027093"),
        solsha3.Uint256(big.NewInt(100)),
        solsha3.String("foo"),
        solsha3.Bytes32("bar"),
        solsha3.Bool(true),
    )

    fmt.Println(hex.EncodeToString(hash)) // 417a4c44724701ba79bb363151dff48909bc058a2c75a81e9cf5208ae4699369
}