Commit c377d513 authored by George Knee's avatar George Knee Committed by GitHub

op-chain-ops/ecotone-scalar: prefer `.FillBytes()` to `.Bytes()` and `copy` (#13472)

* prefer .FillBytes() to .Bytes() and copy

The latter can result in an error if the number is less than 32 bytes in length (it gets padded incorrectly).

* add tests

* output to JSON

* add test case for OPM

* tidy up

* use const in test
parent dad0bc4f
package main package main
import ( import (
"encoding/json"
"flag" "flag"
"fmt" "fmt"
"math" "math"
...@@ -10,6 +11,14 @@ import ( ...@@ -10,6 +11,14 @@ import (
"github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/eth"
) )
// These names match those used in the SystemConfig contract
type outputTy struct {
BaseFee uint `json:"baseFeeScalar"`
BlobbaseFeeScalar uint `json:"blobbaseFeeScalar"`
ScalarHex string `json:"scalarHex"`
Scalar *big.Int `json:"scalar"` // post-ecotone
}
func main() { func main() {
var scalar, blobScalar uint var scalar, blobScalar uint
var decode string var decode string
...@@ -43,13 +52,13 @@ func main() { ...@@ -43,13 +52,13 @@ func main() {
flag.Usage() flag.Usage()
os.Exit(2) os.Exit(2)
} }
encodedSlice := uint256.Bytes() byteLen := (uint256.BitLen() + 7) / 8
if len(encodedSlice) > 32 { if byteLen > 32 {
fmt.Fprintln(flag.CommandLine.Output(), "post-ecotone scalar out of uint256 range") fmt.Fprintln(flag.CommandLine.Output(), "post-ecotone scalar out of uint256 range")
flag.Usage() flag.Usage()
os.Exit(2) os.Exit(2)
} }
copy(encoded[:], encodedSlice) uint256.FillBytes(encoded[:])
decoded, err := eth.DecodeScalar(encoded) decoded, err := eth.DecodeScalar(encoded)
if err != nil { if err != nil {
fmt.Fprintln(flag.CommandLine.Output(), "post-ecotone scalar could not be decoded:", err) fmt.Fprintln(flag.CommandLine.Output(), "post-ecotone scalar could not be decoded:", err)
...@@ -66,9 +75,14 @@ func main() { ...@@ -66,9 +75,14 @@ func main() {
} }
i := new(big.Int).SetBytes(encoded[:]) i := new(big.Int).SetBytes(encoded[:])
fmt.Println("# base fee scalar :", scalar) o, err := json.Marshal(outputTy{
fmt.Println("# blob base fee scalar:", blobScalar) BaseFee: scalar,
fmt.Printf("# v1 hex encoding : 0x%x\n", encoded[:]) BlobbaseFeeScalar: blobScalar,
fmt.Println("# uint value for the 'scalar' parameter in SystemConfigProxy.setGasConfig():") ScalarHex: fmt.Sprintf("0x%x", encoded[:]),
fmt.Println(i) Scalar: i,
})
if err != nil {
panic(err)
}
fmt.Println(string(o))
} }
package main
import (
"bytes"
"encoding/json"
"math/big"
"os/exec"
"testing"
"github.com/stretchr/testify/require"
)
func runMainWithArgs(t *testing.T, args []string) (string, error) {
t.Helper()
cmd := exec.Command("go", "run", "main.go")
cmd.Args = append(cmd.Args, args...)
var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
output := stdout.String() + stderr.String()
return output, err
}
func TestMain_PreEcotoneScalar(t *testing.T) {
output, err := runMainWithArgs(t, []string{"-decode=684000"})
require.NoError(t, err)
o := new(outputTy)
err = json.Unmarshal([]byte(output), o)
require.NoError(t, err)
require.Equal(t, "0x00000000000000000000000000000000000000000000000000000000000a6fe0", o.ScalarHex)
}
func TestMain_PostEcotoneScalar(t *testing.T) {
longScalar := "452312848583266388373324160190187140051835877600158453279135543542576845931"
output, err := runMainWithArgs(t, []string{"-decode=" + longScalar})
require.NoError(t, err)
o := new(outputTy)
err = json.Unmarshal([]byte(output), o)
if err != nil {
t.Fatal(err)
}
expected := &outputTy{
BaseFee: 5227,
BlobbaseFeeScalar: 1014213,
ScalarHex: "0x010000000000000000000000000000000000000000000000000f79c50000146b",
Scalar: new(big.Int),
}
_, ok := expected.Scalar.SetString(longScalar, 0)
require.True(t, ok)
require.Equal(t, expected, o)
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment