mirror of
https://github.com/scroll-tech/scroll.git
synced 2026-01-14 08:28:02 -05:00
70 lines
1.8 KiB
Go
70 lines
1.8 KiB
Go
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"math/big"
|
|
|
|
"github.com/iden3/go-iden3-crypto/keccak256"
|
|
"github.com/scroll-tech/go-ethereum/common"
|
|
"github.com/scroll-tech/go-ethereum/common/math"
|
|
)
|
|
|
|
// Keccak2 compute the keccack256 of two concatenations of bytes32
|
|
func Keccak2(a common.Hash, b common.Hash) common.Hash {
|
|
return common.BytesToHash(keccak256.Hash(append(a.Bytes()[:], b.Bytes()[:]...)))
|
|
}
|
|
|
|
func encodePacked(input ...[]byte) []byte {
|
|
return bytes.Join(input, nil)
|
|
}
|
|
|
|
// ComputeMessageHash compute the message hash
|
|
func ComputeMessageHash(
|
|
target common.Address,
|
|
sender common.Address,
|
|
value *big.Int,
|
|
fee *big.Int,
|
|
deadline *big.Int,
|
|
message []byte,
|
|
messageNonce *big.Int,
|
|
) common.Hash {
|
|
packed := encodePacked(
|
|
target.Bytes(),
|
|
sender.Bytes(),
|
|
math.U256Bytes(value),
|
|
math.U256Bytes(fee),
|
|
math.U256Bytes(deadline),
|
|
math.U256Bytes(messageNonce),
|
|
message,
|
|
)
|
|
return common.BytesToHash(keccak256.Hash(packed))
|
|
}
|
|
|
|
// BufferToUint256Be convert bytes array to uint256 array assuming big-endian
|
|
func BufferToUint256Be(buffer []byte) []*big.Int {
|
|
buffer256 := make([]*big.Int, len(buffer)/32)
|
|
for i := 0; i < len(buffer)/32; i++ {
|
|
buffer256[i] = big.NewInt(0)
|
|
for j := 0; j < 32; j++ {
|
|
buffer256[i] = buffer256[i].Lsh(buffer256[i], 8)
|
|
buffer256[i] = buffer256[i].Add(buffer256[i], big.NewInt(int64(buffer[i*32+j])))
|
|
}
|
|
}
|
|
return buffer256
|
|
}
|
|
|
|
// BufferToUint256Le convert bytes array to uint256 array assuming little-endian
|
|
func BufferToUint256Le(buffer []byte) []*big.Int {
|
|
buffer256 := make([]*big.Int, len(buffer)/32)
|
|
for i := 0; i < len(buffer)/32; i++ {
|
|
v := big.NewInt(0)
|
|
shft := big.NewInt(1)
|
|
for j := 0; j < 32; j++ {
|
|
v = new(big.Int).Add(v, new(big.Int).Mul(shft, big.NewInt(int64(buffer[i*32+j]))))
|
|
shft = new(big.Int).Mul(shft, big.NewInt(256))
|
|
}
|
|
buffer256[i] = v
|
|
}
|
|
return buffer256
|
|
}
|