Skip to content

Commit df336b7

Browse files
authored
crypto/kzg: Faster blob transaction verification (#14)
When computing the aggregated KZG proof, a good chunk of the runtime is spent on the barycentric evaluation. The most expensive operation during the polynomial evaluation is the modular inverse as we divide the polynomial by each root of unity (scaled by z). We precompute the moduular inverses of each divisor as a batch to speed up evaluation. This yields gives us a 3x improvement in the latency of verifying blob transactions: Before ``` go test -benchmem -run='^$' -bench '^BenchmarkVerifyMultiple$' github.com/ethereum/go-ethereum/tests goos: linux goarch: amd64 pkg: github.com/ethereum/go-ethereum/tests cpu: AMD Ryzen 7 3700X 8-Core Processor BenchmarkVerifyMultiple/8-6 5 216293524 ns/op 23122608 B/op 432644 allocs/op BenchmarkVerifyMultiple/16-6 3 429942571 ns/op 46245757 B/op 865270 allocs/op PASS ok github.com/ethereum/go-ethereum/tests 33.350s ``` After: ``` go test -benchmem -run='^$' -bench '^BenchmarkVerifyMultiple$' github.com/ethereum/go-ethereum/tests goos: linux goarch: amd64 pkg: github.com/ethereum/go-ethereum/tests cpu: AMD Ryzen 7 3700X 8-Core Processor BenchmarkVerifyMultiple/8-6 16 69890960 ns/op 25221325 B/op 399904 allocs/op BenchmarkVerifyMultiple/16-6 8 138506286 ns/op 50439658 B/op 799792 allocs/op PASS ok github.com/ethereum/go-ethereum/tests 20.170s ```
1 parent 1bc670f commit df336b7

File tree

4 files changed

+23
-13
lines changed

4 files changed

+23
-13
lines changed

crypto/kzg/util.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ func EvaluatePolyInEvaluationForm(yFr *bls.Fr, poly []bls.Fr, x *bls.Fr) {
5151
var inverseWidth big.Int
5252
blsModInv(&inverseWidth, width)
5353

54+
// Precomputing the mod inverses as a batch is alot faster
55+
invDenom := make([]bls.Fr, params.FieldElementsPerBlob)
56+
for i := range invDenom {
57+
bls.SubModFr(&invDenom[i], x, &DomainFr[i])
58+
}
59+
bls.BatchInvModFr(invDenom)
60+
5461
var y bls.Fr
5562
for i := 0; i < params.FieldElementsPerBlob; i++ {
5663
var num bls.Fr
@@ -60,7 +67,7 @@ func EvaluatePolyInEvaluationForm(yFr *bls.Fr, poly []bls.Fr, x *bls.Fr) {
6067
bls.SubModFr(&denom, x, &DomainFr[i])
6168

6269
var div bls.Fr
63-
bls.DivModFr(&div, &num, &denom)
70+
bls.MulModFr(&div, &num, &invDenom[i])
6471

6572
var tmp bls.Fr
6673
bls.AddModFr(&tmp, &y, &div)

go.mod

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ require (
6262
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519
6363
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028
6464
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
65-
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
65+
golang.org/x/sys v0.0.0-20220818161305-2296e01440c6
6666
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211
6767
golang.org/x/text v0.3.7
6868
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba
@@ -108,3 +108,7 @@ require (
108108
gopkg.in/yaml.v2 v2.4.0 // indirect
109109
gopkg.in/yaml.v3 v3.0.1 // indirect
110110
)
111+
112+
replace github.com/protolambda/go-kzg => github.com/Inphi/go-kzg v0.0.0-20220819034031-381084440411
113+
114+
replace github.com/kilic/bls12-381 => github.com/Inphi/bls12-381 v0.0.0-20220819032644-3ae7bcd28efc

go.sum

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ
2727
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
2828
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
2929
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
30+
github.com/Inphi/bls12-381 v0.0.0-20220819032644-3ae7bcd28efc h1:dO3UA5UAc0KSHVgWNJTtG3PQwmFqlL6lJatg/9tvc38=
31+
github.com/Inphi/bls12-381 v0.0.0-20220819032644-3ae7bcd28efc/go.mod h1:tlkavyke+Ac7h8R3gZIjI5LKBcvMlSWnXNMgT3vZXo8=
32+
github.com/Inphi/go-kzg v0.0.0-20220819034031-381084440411 h1:UPONzX5HWFya8T/r8WYlbiyl1/sTwiPLsVh8NjJY7to=
33+
github.com/Inphi/go-kzg v0.0.0-20220819034031-381084440411/go.mod h1:sy8rQ8S75AAFdRj1QkEGm8kuSrfMa5YEDhbJ7V+nwrI=
3034
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
3135
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
3236
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
@@ -261,8 +265,6 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E
261265
github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0=
262266
github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4=
263267
github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
264-
github.com/kilic/bls12-381 v0.1.1-0.20210208205449-6045b0235e36 h1:ac3KEjgHrX671Q7gW6aGmiQcDrYzmwrdq76HElwyewA=
265-
github.com/kilic/bls12-381 v0.1.1-0.20210208205449-6045b0235e36/go.mod h1:tlkavyke+Ac7h8R3gZIjI5LKBcvMlSWnXNMgT3vZXo8=
266268
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
267269
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
268270
github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
@@ -359,8 +361,6 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
359361
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
360362
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
361363
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
362-
github.com/protolambda/go-kzg v0.0.0-20220220065500-36404333406f h1:lkbqhxyUcDtzxqylImpylMUCkigRLQ4791yn6OLy2/g=
363-
github.com/protolambda/go-kzg v0.0.0-20220220065500-36404333406f/go.mod h1:P9wXBp1WMjLHx2C22Gg7FyqQcJktMAohrKj3tdaWIH0=
364364
github.com/protolambda/ztyp v0.2.1 h1:+rfw75/Zh8EopNlG652TGDXlLgJflj6XWxJ9yCVpJws=
365365
github.com/protolambda/ztyp v0.2.1/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU=
366366
github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc=
@@ -541,13 +541,12 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
541541
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
542542
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
543543
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
544-
golang.org/x/sys v0.0.0-20210305034016-7844c3c200c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
545544
golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
546545
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
547546
golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
548547
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
549-
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
550-
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
548+
golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 h1:Sx/u41w+OwrInGdEckYmEuU5gHoGSL4QbDz3S9s6j4U=
549+
golang.org/x/sys v0.0.0-20220818161305-2296e01440c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
551550
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
552551
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
553552
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=

tests/kzg_bench_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func BenchmarkVerifyMultiple(b *testing.B) {
135135
var blobsSet [][]types.Blob
136136
var commitmentsSet [][]types.KZGCommitment
137137
var hashesSet [][]common.Hash
138-
for i := 0; i < 10; i++ {
138+
for i := 0; i < siz; i++ {
139139
var blobs []types.Blob
140140
var commitments []types.KZGCommitment
141141
var hashes []common.Hash
@@ -200,7 +200,7 @@ func BenchmarkVerifyMultiple(b *testing.B) {
200200
//runBenchmark(2)
201201
//runBenchmark(4)
202202
runBenchmark(8)
203-
//runBenchmark(16)
203+
runBenchmark(16)
204204
}
205205

206206
func BenchmarkBatchVerifyWithoutKZGProofs(b *testing.B) {
@@ -235,8 +235,8 @@ func BenchmarkBatchVerifyWithoutKZGProofs(b *testing.B) {
235235
})
236236
}
237237

238-
runBenchmark(2)
239-
runBenchmark(4)
238+
//runBenchmark(2)
239+
//runBenchmark(4)
240240
runBenchmark(8)
241241
runBenchmark(16)
242242
}

0 commit comments

Comments
 (0)