mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-25 14:16:44 +00:00
Pass EVM pointer when running precompile
This commit is contained in:
parent
e206d3f897
commit
ff86dbf72a
4 changed files with 35 additions and 35 deletions
|
|
@ -39,7 +39,7 @@ import (
|
||||||
// contract.
|
// contract.
|
||||||
type PrecompiledContract interface {
|
type PrecompiledContract interface {
|
||||||
RequiredGas(input []byte) uint64 // RequiredPrice calculates the contract gas use
|
RequiredGas(input []byte) uint64 // RequiredPrice calculates the contract gas use
|
||||||
Run(input []byte) ([]byte, error) // Run runs the precompiled contract
|
Run(evm *EVM, input []byte) ([]byte, error) // Run runs the precompiled contract
|
||||||
}
|
}
|
||||||
|
|
||||||
// PrecompiledContractsHomestead contains the default set of pre-compiled Ethereum
|
// PrecompiledContractsHomestead contains the default set of pre-compiled Ethereum
|
||||||
|
|
@ -168,13 +168,13 @@ func ActivePrecompiles(rules params.Rules) []common.Address {
|
||||||
// - the returned bytes,
|
// - the returned bytes,
|
||||||
// - the _remaining_ gas,
|
// - the _remaining_ gas,
|
||||||
// - any error that occurred
|
// - any error that occurred
|
||||||
func RunPrecompiledContract(p PrecompiledContract, input []byte, suppliedGas uint64) (ret []byte, remainingGas uint64, err error) {
|
func RunPrecompiledContract(p PrecompiledContract, evm *EVM, input []byte, suppliedGas uint64) (ret []byte, remainingGas uint64, err error) {
|
||||||
gasCost := p.RequiredGas(input)
|
gasCost := p.RequiredGas(input)
|
||||||
if suppliedGas < gasCost {
|
if suppliedGas < gasCost {
|
||||||
return nil, 0, ErrOutOfGas
|
return nil, 0, ErrOutOfGas
|
||||||
}
|
}
|
||||||
suppliedGas -= gasCost
|
suppliedGas -= gasCost
|
||||||
output, err := p.Run(input)
|
output, err := p.Run(evm, input)
|
||||||
return output, suppliedGas, err
|
return output, suppliedGas, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -185,7 +185,7 @@ func (c *ecrecover) RequiredGas(input []byte) uint64 {
|
||||||
return params.EcrecoverGas
|
return params.EcrecoverGas
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ecrecover) Run(input []byte) ([]byte, error) {
|
func (c *ecrecover) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
const ecRecoverInputLength = 128
|
const ecRecoverInputLength = 128
|
||||||
|
|
||||||
input = common.RightPadBytes(input, ecRecoverInputLength)
|
input = common.RightPadBytes(input, ecRecoverInputLength)
|
||||||
|
|
@ -226,7 +226,7 @@ type sha256hash struct{}
|
||||||
func (c *sha256hash) RequiredGas(input []byte) uint64 {
|
func (c *sha256hash) RequiredGas(input []byte) uint64 {
|
||||||
return uint64(len(input)+31)/32*params.Sha256PerWordGas + params.Sha256BaseGas
|
return uint64(len(input)+31)/32*params.Sha256PerWordGas + params.Sha256BaseGas
|
||||||
}
|
}
|
||||||
func (c *sha256hash) Run(input []byte) ([]byte, error) {
|
func (c *sha256hash) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
h := sha256.Sum256(input)
|
h := sha256.Sum256(input)
|
||||||
return h[:], nil
|
return h[:], nil
|
||||||
}
|
}
|
||||||
|
|
@ -241,7 +241,7 @@ type ripemd160hash struct{}
|
||||||
func (c *ripemd160hash) RequiredGas(input []byte) uint64 {
|
func (c *ripemd160hash) RequiredGas(input []byte) uint64 {
|
||||||
return uint64(len(input)+31)/32*params.Ripemd160PerWordGas + params.Ripemd160BaseGas
|
return uint64(len(input)+31)/32*params.Ripemd160PerWordGas + params.Ripemd160BaseGas
|
||||||
}
|
}
|
||||||
func (c *ripemd160hash) Run(input []byte) ([]byte, error) {
|
func (c *ripemd160hash) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
ripemd := ripemd160.New()
|
ripemd := ripemd160.New()
|
||||||
ripemd.Write(input)
|
ripemd.Write(input)
|
||||||
return common.LeftPadBytes(ripemd.Sum(nil), 32), nil
|
return common.LeftPadBytes(ripemd.Sum(nil), 32), nil
|
||||||
|
|
@ -257,7 +257,7 @@ type dataCopy struct{}
|
||||||
func (c *dataCopy) RequiredGas(input []byte) uint64 {
|
func (c *dataCopy) RequiredGas(input []byte) uint64 {
|
||||||
return uint64(len(input)+31)/32*params.IdentityPerWordGas + params.IdentityBaseGas
|
return uint64(len(input)+31)/32*params.IdentityPerWordGas + params.IdentityBaseGas
|
||||||
}
|
}
|
||||||
func (c *dataCopy) Run(in []byte) ([]byte, error) {
|
func (c *dataCopy) Run(_ *EVM, in []byte) ([]byte, error) {
|
||||||
return common.CopyBytes(in), nil
|
return common.CopyBytes(in), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -383,7 +383,7 @@ func (c *bigModExp) RequiredGas(input []byte) uint64 {
|
||||||
return gas.Uint64()
|
return gas.Uint64()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bigModExp) Run(input []byte) ([]byte, error) {
|
func (c *bigModExp) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
var (
|
var (
|
||||||
baseLen = new(big.Int).SetBytes(getData(input, 0, 32)).Uint64()
|
baseLen = new(big.Int).SetBytes(getData(input, 0, 32)).Uint64()
|
||||||
expLen = new(big.Int).SetBytes(getData(input, 32, 32)).Uint64()
|
expLen = new(big.Int).SetBytes(getData(input, 32, 32)).Uint64()
|
||||||
|
|
@ -463,7 +463,7 @@ func (c *bn256AddIstanbul) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bn256AddGasIstanbul
|
return params.Bn256AddGasIstanbul
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bn256AddIstanbul) Run(input []byte) ([]byte, error) {
|
func (c *bn256AddIstanbul) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
return runBn256Add(input)
|
return runBn256Add(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -476,7 +476,7 @@ func (c *bn256AddByzantium) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bn256AddGasByzantium
|
return params.Bn256AddGasByzantium
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bn256AddByzantium) Run(input []byte) ([]byte, error) {
|
func (c *bn256AddByzantium) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
return runBn256Add(input)
|
return runBn256Add(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -501,7 +501,7 @@ func (c *bn256ScalarMulIstanbul) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bn256ScalarMulGasIstanbul
|
return params.Bn256ScalarMulGasIstanbul
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bn256ScalarMulIstanbul) Run(input []byte) ([]byte, error) {
|
func (c *bn256ScalarMulIstanbul) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
return runBn256ScalarMul(input)
|
return runBn256ScalarMul(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -514,7 +514,7 @@ func (c *bn256ScalarMulByzantium) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bn256ScalarMulGasByzantium
|
return params.Bn256ScalarMulGasByzantium
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bn256ScalarMulByzantium) Run(input []byte) ([]byte, error) {
|
func (c *bn256ScalarMulByzantium) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
return runBn256ScalarMul(input)
|
return runBn256ScalarMul(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -569,7 +569,7 @@ func (c *bn256PairingIstanbul) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bn256PairingBaseGasIstanbul + uint64(len(input)/192)*params.Bn256PairingPerPointGasIstanbul
|
return params.Bn256PairingBaseGasIstanbul + uint64(len(input)/192)*params.Bn256PairingPerPointGasIstanbul
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bn256PairingIstanbul) Run(input []byte) ([]byte, error) {
|
func (c *bn256PairingIstanbul) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
return runBn256Pairing(input)
|
return runBn256Pairing(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -582,7 +582,7 @@ func (c *bn256PairingByzantium) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bn256PairingBaseGasByzantium + uint64(len(input)/192)*params.Bn256PairingPerPointGasByzantium
|
return params.Bn256PairingBaseGasByzantium + uint64(len(input)/192)*params.Bn256PairingPerPointGasByzantium
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bn256PairingByzantium) Run(input []byte) ([]byte, error) {
|
func (c *bn256PairingByzantium) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
return runBn256Pairing(input)
|
return runBn256Pairing(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -608,7 +608,7 @@ var (
|
||||||
errBlake2FInvalidFinalFlag = errors.New("invalid final flag")
|
errBlake2FInvalidFinalFlag = errors.New("invalid final flag")
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *blake2F) Run(input []byte) ([]byte, error) {
|
func (c *blake2F) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
// Make sure the input is valid (correct length and final flag)
|
// Make sure the input is valid (correct length and final flag)
|
||||||
if len(input) != blake2FInputLength {
|
if len(input) != blake2FInputLength {
|
||||||
return nil, errBlake2FInvalidInputLength
|
return nil, errBlake2FInvalidInputLength
|
||||||
|
|
@ -662,7 +662,7 @@ func (c *bls12381G1Add) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bls12381G1AddGas
|
return params.Bls12381G1AddGas
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bls12381G1Add) Run(input []byte) ([]byte, error) {
|
func (c *bls12381G1Add) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
// Implements EIP-2537 G1Add precompile.
|
// Implements EIP-2537 G1Add precompile.
|
||||||
// > G1 addition call expects `256` bytes as an input that is interpreted as byte concatenation of two G1 points (`128` bytes each).
|
// > G1 addition call expects `256` bytes as an input that is interpreted as byte concatenation of two G1 points (`128` bytes each).
|
||||||
// > Output is an encoding of addition operation result - single G1 point (`128` bytes).
|
// > Output is an encoding of addition operation result - single G1 point (`128` bytes).
|
||||||
|
|
@ -700,7 +700,7 @@ func (c *bls12381G1Mul) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bls12381G1MulGas
|
return params.Bls12381G1MulGas
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bls12381G1Mul) Run(input []byte) ([]byte, error) {
|
func (c *bls12381G1Mul) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
// Implements EIP-2537 G1Mul precompile.
|
// Implements EIP-2537 G1Mul precompile.
|
||||||
// > G1 multiplication call expects `160` bytes as an input that is interpreted as byte concatenation of encoding of G1 point (`128` bytes) and encoding of a scalar value (`32` bytes).
|
// > G1 multiplication call expects `160` bytes as an input that is interpreted as byte concatenation of encoding of G1 point (`128` bytes) and encoding of a scalar value (`32` bytes).
|
||||||
// > Output is an encoding of multiplication operation result - single G1 point (`128` bytes).
|
// > Output is an encoding of multiplication operation result - single G1 point (`128` bytes).
|
||||||
|
|
@ -750,7 +750,7 @@ func (c *bls12381G1MultiExp) RequiredGas(input []byte) uint64 {
|
||||||
return (uint64(k) * params.Bls12381G1MulGas * discount) / 1000
|
return (uint64(k) * params.Bls12381G1MulGas * discount) / 1000
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bls12381G1MultiExp) Run(input []byte) ([]byte, error) {
|
func (c *bls12381G1MultiExp) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
// Implements EIP-2537 G1MultiExp precompile.
|
// Implements EIP-2537 G1MultiExp precompile.
|
||||||
// G1 multiplication call expects `160*k` bytes as an input that is interpreted as byte concatenation of `k` slices each of them being a byte concatenation of encoding of G1 point (`128` bytes) and encoding of a scalar value (`32` bytes).
|
// G1 multiplication call expects `160*k` bytes as an input that is interpreted as byte concatenation of `k` slices each of them being a byte concatenation of encoding of G1 point (`128` bytes) and encoding of a scalar value (`32` bytes).
|
||||||
// Output is an encoding of multiexponentiation operation result - single G1 point (`128` bytes).
|
// Output is an encoding of multiexponentiation operation result - single G1 point (`128` bytes).
|
||||||
|
|
@ -793,7 +793,7 @@ func (c *bls12381G2Add) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bls12381G2AddGas
|
return params.Bls12381G2AddGas
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bls12381G2Add) Run(input []byte) ([]byte, error) {
|
func (c *bls12381G2Add) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
// Implements EIP-2537 G2Add precompile.
|
// Implements EIP-2537 G2Add precompile.
|
||||||
// > G2 addition call expects `512` bytes as an input that is interpreted as byte concatenation of two G2 points (`256` bytes each).
|
// > G2 addition call expects `512` bytes as an input that is interpreted as byte concatenation of two G2 points (`256` bytes each).
|
||||||
// > Output is an encoding of addition operation result - single G2 point (`256` bytes).
|
// > Output is an encoding of addition operation result - single G2 point (`256` bytes).
|
||||||
|
|
@ -831,7 +831,7 @@ func (c *bls12381G2Mul) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bls12381G2MulGas
|
return params.Bls12381G2MulGas
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bls12381G2Mul) Run(input []byte) ([]byte, error) {
|
func (c *bls12381G2Mul) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
// Implements EIP-2537 G2MUL precompile logic.
|
// Implements EIP-2537 G2MUL precompile logic.
|
||||||
// > G2 multiplication call expects `288` bytes as an input that is interpreted as byte concatenation of encoding of G2 point (`256` bytes) and encoding of a scalar value (`32` bytes).
|
// > G2 multiplication call expects `288` bytes as an input that is interpreted as byte concatenation of encoding of G2 point (`256` bytes) and encoding of a scalar value (`32` bytes).
|
||||||
// > Output is an encoding of multiplication operation result - single G2 point (`256` bytes).
|
// > Output is an encoding of multiplication operation result - single G2 point (`256` bytes).
|
||||||
|
|
@ -881,7 +881,7 @@ func (c *bls12381G2MultiExp) RequiredGas(input []byte) uint64 {
|
||||||
return (uint64(k) * params.Bls12381G2MulGas * discount) / 1000
|
return (uint64(k) * params.Bls12381G2MulGas * discount) / 1000
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bls12381G2MultiExp) Run(input []byte) ([]byte, error) {
|
func (c *bls12381G2MultiExp) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
// Implements EIP-2537 G2MultiExp precompile logic
|
// Implements EIP-2537 G2MultiExp precompile logic
|
||||||
// > G2 multiplication call expects `288*k` bytes as an input that is interpreted as byte concatenation of `k` slices each of them being a byte concatenation of encoding of G2 point (`256` bytes) and encoding of a scalar value (`32` bytes).
|
// > G2 multiplication call expects `288*k` bytes as an input that is interpreted as byte concatenation of `k` slices each of them being a byte concatenation of encoding of G2 point (`256` bytes) and encoding of a scalar value (`32` bytes).
|
||||||
// > Output is an encoding of multiexponentiation operation result - single G2 point (`256` bytes).
|
// > Output is an encoding of multiexponentiation operation result - single G2 point (`256` bytes).
|
||||||
|
|
@ -924,7 +924,7 @@ func (c *bls12381Pairing) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bls12381PairingBaseGas + uint64(len(input)/384)*params.Bls12381PairingPerPairGas
|
return params.Bls12381PairingBaseGas + uint64(len(input)/384)*params.Bls12381PairingPerPairGas
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bls12381Pairing) Run(input []byte) ([]byte, error) {
|
func (c *bls12381Pairing) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
// Implements EIP-2537 Pairing precompile logic.
|
// Implements EIP-2537 Pairing precompile logic.
|
||||||
// > Pairing call expects `384*k` bytes as an inputs that is interpreted as byte concatenation of `k` slices. Each slice has the following structure:
|
// > Pairing call expects `384*k` bytes as an inputs that is interpreted as byte concatenation of `k` slices. Each slice has the following structure:
|
||||||
// > - `128` bytes of G1 point encoding
|
// > - `128` bytes of G1 point encoding
|
||||||
|
|
@ -1003,7 +1003,7 @@ func (c *bls12381MapG1) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bls12381MapG1Gas
|
return params.Bls12381MapG1Gas
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bls12381MapG1) Run(input []byte) ([]byte, error) {
|
func (c *bls12381MapG1) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
// Implements EIP-2537 Map_To_G1 precompile.
|
// Implements EIP-2537 Map_To_G1 precompile.
|
||||||
// > Field-to-curve call expects `64` bytes an an input that is interpreted as a an element of the base field.
|
// > Field-to-curve call expects `64` bytes an an input that is interpreted as a an element of the base field.
|
||||||
// > Output of this call is `128` bytes and is G1 point following respective encoding rules.
|
// > Output of this call is `128` bytes and is G1 point following respective encoding rules.
|
||||||
|
|
@ -1038,7 +1038,7 @@ func (c *bls12381MapG2) RequiredGas(input []byte) uint64 {
|
||||||
return params.Bls12381MapG2Gas
|
return params.Bls12381MapG2Gas
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *bls12381MapG2) Run(input []byte) ([]byte, error) {
|
func (c *bls12381MapG2) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
// Implements EIP-2537 Map_FP2_TO_G2 precompile logic.
|
// Implements EIP-2537 Map_FP2_TO_G2 precompile logic.
|
||||||
// > Field-to-curve call expects `128` bytes an an input that is interpreted as a an element of the quadratic extension field.
|
// > Field-to-curve call expects `128` bytes an an input that is interpreted as a an element of the quadratic extension field.
|
||||||
// > Output of this call is `256` bytes and is G2 point following respective encoding rules.
|
// > Output of this call is `256` bytes and is G2 point following respective encoding rules.
|
||||||
|
|
@ -1093,7 +1093,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
// Run executes the point evaluation precompile.
|
// Run executes the point evaluation precompile.
|
||||||
func (b *kzgPointEvaluation) Run(input []byte) ([]byte, error) {
|
func (b *kzgPointEvaluation) Run(_ *EVM, input []byte) ([]byte, error) {
|
||||||
if len(input) != blobVerifyInputLength {
|
if len(input) != blobVerifyInputLength {
|
||||||
return nil, errBlobVerifyInvalidInputLength
|
return nil, errBlobVerifyInvalidInputLength
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ func testPrecompiled(addr string, test precompiledTest, t *testing.T) {
|
||||||
in := common.Hex2Bytes(test.Input)
|
in := common.Hex2Bytes(test.Input)
|
||||||
gas := p.RequiredGas(in)
|
gas := p.RequiredGas(in)
|
||||||
t.Run(fmt.Sprintf("%s-Gas=%d", test.Name, gas), func(t *testing.T) {
|
t.Run(fmt.Sprintf("%s-Gas=%d", test.Name, gas), func(t *testing.T) {
|
||||||
if res, _, err := RunPrecompiledContract(p, in, gas); err != nil {
|
if res, _, err := RunPrecompiledContract(p, nil, in, gas); err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
} else if common.Bytes2Hex(res) != test.Expected {
|
} else if common.Bytes2Hex(res) != test.Expected {
|
||||||
t.Errorf("Expected %v, got %v", test.Expected, common.Bytes2Hex(res))
|
t.Errorf("Expected %v, got %v", test.Expected, common.Bytes2Hex(res))
|
||||||
|
|
@ -120,7 +120,7 @@ func testPrecompiledOOG(addr string, test precompiledTest, t *testing.T) {
|
||||||
gas := p.RequiredGas(in) - 1
|
gas := p.RequiredGas(in) - 1
|
||||||
|
|
||||||
t.Run(fmt.Sprintf("%s-Gas=%d", test.Name, gas), func(t *testing.T) {
|
t.Run(fmt.Sprintf("%s-Gas=%d", test.Name, gas), func(t *testing.T) {
|
||||||
_, _, err := RunPrecompiledContract(p, in, gas)
|
_, _, err := RunPrecompiledContract(p, nil, in, gas)
|
||||||
if err.Error() != "out of gas" {
|
if err.Error() != "out of gas" {
|
||||||
t.Errorf("Expected error [out of gas], got [%v]", err)
|
t.Errorf("Expected error [out of gas], got [%v]", err)
|
||||||
}
|
}
|
||||||
|
|
@ -137,7 +137,7 @@ func testPrecompiledFailure(addr string, test precompiledFailureTest, t *testing
|
||||||
in := common.Hex2Bytes(test.Input)
|
in := common.Hex2Bytes(test.Input)
|
||||||
gas := p.RequiredGas(in)
|
gas := p.RequiredGas(in)
|
||||||
t.Run(test.Name, func(t *testing.T) {
|
t.Run(test.Name, func(t *testing.T) {
|
||||||
_, _, err := RunPrecompiledContract(p, in, gas)
|
_, _, err := RunPrecompiledContract(p, nil, in, gas)
|
||||||
if err.Error() != test.ExpectedError {
|
if err.Error() != test.ExpectedError {
|
||||||
t.Errorf("Expected error [%v], got [%v]", test.ExpectedError, err)
|
t.Errorf("Expected error [%v], got [%v]", test.ExpectedError, err)
|
||||||
}
|
}
|
||||||
|
|
@ -169,7 +169,7 @@ func benchmarkPrecompiled(addr string, test precompiledTest, bench *testing.B) {
|
||||||
bench.ResetTimer()
|
bench.ResetTimer()
|
||||||
for i := 0; i < bench.N; i++ {
|
for i := 0; i < bench.N; i++ {
|
||||||
copy(data, in)
|
copy(data, in)
|
||||||
res, _, err = RunPrecompiledContract(p, data, reqGas)
|
res, _, err = RunPrecompiledContract(p, nil, data, reqGas)
|
||||||
}
|
}
|
||||||
bench.StopTimer()
|
bench.StopTimer()
|
||||||
elapsed := uint64(time.Since(start))
|
elapsed := uint64(time.Since(start))
|
||||||
|
|
|
||||||
|
|
@ -224,7 +224,7 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
|
||||||
}
|
}
|
||||||
|
|
||||||
if isPrecompile {
|
if isPrecompile {
|
||||||
ret, gas, err = RunPrecompiledContract(p, input, gas)
|
ret, gas, err = RunPrecompiledContract(p, evm, input, gas)
|
||||||
} else {
|
} else {
|
||||||
// Initialise a new contract and set the code that is to be used by the EVM.
|
// Initialise a new contract and set the code that is to be used by the EVM.
|
||||||
// The contract is a scoped environment for this execution context only.
|
// The contract is a scoped environment for this execution context only.
|
||||||
|
|
@ -287,7 +287,7 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte,
|
||||||
|
|
||||||
// It is allowed to call precompiles, even via delegatecall
|
// It is allowed to call precompiles, even via delegatecall
|
||||||
if p, isPrecompile := evm.precompile(addr); isPrecompile {
|
if p, isPrecompile := evm.precompile(addr); isPrecompile {
|
||||||
ret, gas, err = RunPrecompiledContract(p, input, gas)
|
ret, gas, err = RunPrecompiledContract(p, evm, input, gas)
|
||||||
} else {
|
} else {
|
||||||
addrCopy := addr
|
addrCopy := addr
|
||||||
// Initialise a new contract and set the code that is to be used by the EVM.
|
// Initialise a new contract and set the code that is to be used by the EVM.
|
||||||
|
|
@ -332,7 +332,7 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by
|
||||||
|
|
||||||
// It is allowed to call precompiles, even via delegatecall
|
// It is allowed to call precompiles, even via delegatecall
|
||||||
if p, isPrecompile := evm.precompile(addr); isPrecompile {
|
if p, isPrecompile := evm.precompile(addr); isPrecompile {
|
||||||
ret, gas, err = RunPrecompiledContract(p, input, gas)
|
ret, gas, err = RunPrecompiledContract(p, evm, input, gas)
|
||||||
} else {
|
} else {
|
||||||
addrCopy := addr
|
addrCopy := addr
|
||||||
// Initialise a new contract and make initialise the delegate values
|
// Initialise a new contract and make initialise the delegate values
|
||||||
|
|
@ -381,7 +381,7 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
if p, isPrecompile := evm.precompile(addr); isPrecompile {
|
if p, isPrecompile := evm.precompile(addr); isPrecompile {
|
||||||
ret, gas, err = RunPrecompiledContract(p, input, gas)
|
ret, gas, err = RunPrecompiledContract(p, evm, input, gas)
|
||||||
} else {
|
} else {
|
||||||
// At this point, we use a copy of address. If we don't, the go compiler will
|
// At this point, we use a copy of address. If we don't, the go compiler will
|
||||||
// leak the 'contract' to the outer scope, and make allocation for 'contract'
|
// leak the 'contract' to the outer scope, and make allocation for 'contract'
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ func fuzz(id byte, data []byte) int {
|
||||||
}
|
}
|
||||||
cpy := make([]byte, len(data))
|
cpy := make([]byte, len(data))
|
||||||
copy(cpy, data)
|
copy(cpy, data)
|
||||||
_, err := precompile.Run(cpy)
|
_, err := precompile.Run(nil, cpy)
|
||||||
if !bytes.Equal(cpy, data) {
|
if !bytes.Equal(cpy, data) {
|
||||||
panic(fmt.Sprintf("input data modified, precompile %d: %x %x", id, data, cpy))
|
panic(fmt.Sprintf("input data modified, precompile %d: %x %x", id, data, cpy))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue