Попытка сопоставить библиотеку «golang.org/x/crypto/sha3» с Solidity sha3() доставляет мне массу хлопот. Это обсуждалось здесь , но я почему-то не могу применить это в ходу. Как мне обрабатывать тип big.Int, я получаю solidity.sha3 (uint256 (1)) == golang.sha3.Sum256 (convertMyBigInt (myBigInt))?
Я превращаю bigInt в шестнадцатеричный массив байтов, затем заполняю левый узел нулями, хеширую и вывожу.
//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))
вывод: 26502030f0954243c70cb7fa68e0752ce2bf99aabfc0219d5184635d4c61dbd8
твердость дает мне:
sha3(uint(1))
b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6
Может ли кто-нибудь дать мне короткий пример, как элегантно сопоставить Solidity sha3 с golang sha3? Я был бы очень благодарен!
Вот полный рабочий пример создания хэшей Solidity sha3 из 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
}
Прочность:
sha3(uint(1))
b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6
Я сделал библиотеку go-solidity-sha3 , чтобы иметь возможность легко преобразовывать типы Solidity в хэши Solidity sha3 в Go. Вот пример:
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
}
Более сложный пример:
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
}