From a47c1804b88c82e16c7230be5f9c5151b00e9f8f Mon Sep 17 00:00:00 2001 From: Francis Li Date: Wed, 19 Mar 2025 15:30:36 -0700 Subject: [PATCH] crypto: move from go-kzg-4844 to go-eth-kzg, and add new 7594 related methods --- crypto/kzg4844/kzg4844.go | 28 ++++++++++ crypto/kzg4844/kzg4844_ckzg_cgo.go | 82 ++++++++++++++++++++++++++-- crypto/kzg4844/kzg4844_ckzg_nocgo.go | 15 +++++ crypto/kzg4844/kzg4844_gokzg.go | 63 ++++++++++++++++++++- crypto/kzg4844/kzg4844_test.go | 2 +- go.mod | 14 ++--- go.sum | 28 +++++----- 7 files changed, 205 insertions(+), 27 deletions(-) diff --git a/crypto/kzg4844/kzg4844.go b/crypto/kzg4844/kzg4844.go index 39fdfbe740..8291d1ad25 100644 --- a/crypto/kzg4844/kzg4844.go +++ b/crypto/kzg4844/kzg4844.go @@ -24,6 +24,7 @@ import ( "reflect" "sync/atomic" + gokzg4844 "github.com/crate-crypto/go-eth-kzg" "github.com/ethereum/go-ethereum/common/hexutil" ) @@ -39,6 +40,9 @@ var ( // Blob represents a 4844 data blob. type Blob [131072]byte +// Cell represents a 7594 data cell. +type Cell [gokzg4844.BytesPerCell]byte + // UnmarshalJSON parses a blob in hex syntax. func (b *Blob) UnmarshalJSON(input []byte) error { return hexutil.UnmarshalFixedJSON(blobT, input, b[:]) @@ -149,6 +153,30 @@ func VerifyBlobProof(blob *Blob, commitment Commitment, proof Proof) error { return gokzgVerifyBlobProof(blob, commitment, proof) } +// VerifyCellKZGProofBatch verifies a batch of KZG proofs for a set of cells. +func VerifyCellKZGProofBatch(commitments []Commitment, cellIndicies []uint64, cells []Cell, proofs []Proof) error { + if useCKZG.Load() { + return ckzgVerifyCellKZGProofBatch(commitments, cellIndicies, cells, proofs) + } + return gokzgVerifyCellKZGProofBatch(commitments, cellIndicies, cells, proofs) +} + +// ComputeCells computes the cells for a given blob. +func ComputeCells(blob *Blob) ([]Cell, error) { + if useCKZG.Load() { + return ckzgComputeCells(blob) + } + return gokzgComputeCells(blob) +} + +// ComputeCellsAndKZGProofs computes the cells and KZG proofs for a given blob. +func ComputeCellsAndKZGProofs(blob *Blob) ([]Cell, []Proof, error) { + if useCKZG.Load() { + return ckzgComputeCellsAndKZGProofs(blob) + } + return gokzgComputeCellsAndKZGProofs(blob) +} + // CalcBlobHashV1 calculates the 'versioned blob hash' of a commitment. // The given hasher must be a sha256 hash instance, otherwise the result will be invalid! func CalcBlobHashV1(hasher hash.Hash, commit *Commitment) (vh [32]byte) { diff --git a/crypto/kzg4844/kzg4844_ckzg_cgo.go b/crypto/kzg4844/kzg4844_ckzg_cgo.go index dce592b444..7bb83a6df4 100644 --- a/crypto/kzg4844/kzg4844_ckzg_cgo.go +++ b/crypto/kzg4844/kzg4844_ckzg_cgo.go @@ -23,8 +23,8 @@ import ( "errors" "sync" - gokzg4844 "github.com/crate-crypto/go-kzg-4844" - ckzg4844 "github.com/ethereum/c-kzg-4844/bindings/go" + gokzg4844 "github.com/crate-crypto/go-eth-kzg" + ckzg4844 "github.com/ethereum/c-kzg-4844/v2/bindings/go" "github.com/ethereum/go-ethereum/common/hexutil" ) @@ -47,15 +47,22 @@ func ckzgInit() { if err = gokzg4844.CheckTrustedSetupIsWellFormed(params); err != nil { panic(err) } - g1s := make([]byte, len(params.SetupG1Lagrange)*(len(params.SetupG1Lagrange[0])-2)/2) + g1Lag := make([]byte, len(params.SetupG1Lagrange)*(len(params.SetupG1Lagrange[0])-2)/2) for i, g1 := range params.SetupG1Lagrange { + copy(g1Lag[i*(len(g1)-2)/2:], hexutil.MustDecode(g1)) + } + g1s := make([]byte, len(params.SetupG1Monomial)*(len(params.SetupG1Monomial[0])-2)/2) + for i, g1 := range params.SetupG1Monomial { copy(g1s[i*(len(g1)-2)/2:], hexutil.MustDecode(g1)) } g2s := make([]byte, len(params.SetupG2)*(len(params.SetupG2[0])-2)/2) for i, g2 := range params.SetupG2 { copy(g2s[i*(len(g2)-2)/2:], hexutil.MustDecode(g2)) } - if err = ckzg4844.LoadTrustedSetup(g1s, g2s); err != nil { + // The last parameter determines the multiplication table, see https://notes.ethereum.org/@jtraglia/windowed_multiplications + // set it to 8 for now, it's a decent compromise between size and speed + // Also note that the number must be the same for all trusted setups (in CL as well) + if err = ckzg4844.LoadTrustedSetup(g1s, g1Lag, g2s, 8); err != nil { panic(err) } } @@ -125,3 +132,70 @@ func ckzgVerifyBlobProof(blob *Blob, commitment Commitment, proof Proof) error { } return nil } + +// ckzgVerifyCellKZGProofBatch verifies a batch of KZG proofs for a set of cells. +func ckzgVerifyCellKZGProofBatch(commitments []Commitment, cellIndicies []uint64, cells []Cell, proofs []Proof) error { + ckzgIniter.Do(ckzgInit) + + comts := make([]ckzg4844.Bytes48, len(commitments)) + for i, commitment := range commitments { + comts[i] = (ckzg4844.Bytes48)(commitment) + } + + cellInputs := make([]ckzg4844.Cell, len(cells)) + for i := range cells { + cellInputs[i] = (ckzg4844.Cell)(cells[i]) + } + + proofsInput := make([]ckzg4844.Bytes48, len(proofs)) + for i, proof := range proofs { + proofsInput[i] = (ckzg4844.Bytes48)(proof) + } + + valid, err := ckzg4844.VerifyCellKZGProofBatch(comts, cellIndicies, cellInputs, proofsInput) + if err != nil { + return err + } + if !valid { + return errors.New("invalid proof") + } + return nil +} + +// ckzgComputeCells computes the cells for a given blob. +func ckzgComputeCells(blob *Blob) ([]Cell, error) { + ckzgIniter.Do(ckzgInit) + + result, err := ckzg4844.ComputeCells((*ckzg4844.Blob)(blob)) + if err != nil { + return nil, err + } + + cells := make([]Cell, len(result)) + for i, cell := range result { + cells[i] = (Cell)(cell) + } + return cells, nil +} + +// ckzgComputeCellsAndKZGProofs computes the cells and KZG proofs for a given blob. +func ckzgComputeCellsAndKZGProofs(blob *Blob) ([]Cell, []Proof, error) { + ckzgIniter.Do(ckzgInit) + + cellResults, proofResults, err := ckzg4844.ComputeCellsAndKZGProofs((*ckzg4844.Blob)(blob)) + if err != nil { + return nil, nil, err + } + + cells := make([]Cell, len(cellResults)) + for i, cell := range cellResults { + cells[i] = (Cell)(cell) + } + + proofs := make([]Proof, len(proofResults)) + for i, proof := range proofResults { + proofs[i] = (Proof)(proof) + } + + return cells, proofs, nil +} diff --git a/crypto/kzg4844/kzg4844_ckzg_nocgo.go b/crypto/kzg4844/kzg4844_ckzg_nocgo.go index 0662b2632f..6fe94a1116 100644 --- a/crypto/kzg4844/kzg4844_ckzg_nocgo.go +++ b/crypto/kzg4844/kzg4844_ckzg_nocgo.go @@ -60,3 +60,18 @@ func ckzgComputeBlobProof(blob *Blob, commitment Commitment) (Proof, error) { func ckzgVerifyBlobProof(blob *Blob, commitment Commitment, proof Proof) error { panic("unsupported platform") } + +// ckzgVerifyCellKZGProofBatch verifies a batch of KZG proofs for a set of cells. +func ckzgVerifyCellKZGProofBatch(commitments []Commitment, cellIndicies []uint64, cells []Cell, proofs []Proof) error { + panic("unsupported platform") +} + +// ckzgComputeCells computes the cells for a given blob. +func ckzgComputeCells(blob *Blob) ([]Cell, error) { + panic("unsupported platform") +} + +// ckzgComputeCellsAndKZGProofs computes the cells and KZG proofs for a given blob. +func ckzgComputeCellsAndKZGProofs(blob *Blob) ([]Cell, []Proof, error) { + panic("unsupported platform") +} diff --git a/crypto/kzg4844/kzg4844_gokzg.go b/crypto/kzg4844/kzg4844_gokzg.go index b4af9b1671..129d0183e1 100644 --- a/crypto/kzg4844/kzg4844_gokzg.go +++ b/crypto/kzg4844/kzg4844_gokzg.go @@ -20,7 +20,7 @@ import ( "encoding/json" "sync" - gokzg4844 "github.com/crate-crypto/go-kzg-4844" + gokzg4844 "github.com/crate-crypto/go-eth-kzg" ) // context is the crypto primitive pre-seeded with the trusted setup parameters. @@ -96,3 +96,64 @@ func gokzgVerifyBlobProof(blob *Blob, commitment Commitment, proof Proof) error return context.VerifyBlobKZGProof((*gokzg4844.Blob)(blob), (gokzg4844.KZGCommitment)(commitment), (gokzg4844.KZGProof)(proof)) } + +// gokzgVerifyCellKZGProofBatch verifies a batch of KZG proofs for a set of cells. +func gokzgVerifyCellKZGProofBatch(commitments []Commitment, cellIndicies []uint64, cells []Cell, proofs []Proof) error { + gokzgIniter.Do(gokzgInit) + + comts := make([]gokzg4844.KZGCommitment, len(commitments)) + for i, commitment := range commitments { + comts[i] = (gokzg4844.KZGCommitment)(commitment) + } + + cellInputs := make([]*gokzg4844.Cell, len(cells)) + for i := range cells { + cellInputs[i] = (*gokzg4844.Cell)(&cells[i]) + } + + proofsInput := make([]gokzg4844.KZGProof, len(proofs)) + for i, proof := range proofs { + proofsInput[i] = (gokzg4844.KZGProof)(proof) + } + + return context.VerifyCellKZGProofBatch(comts, cellIndicies, cellInputs, proofsInput) +} + +// gokzgComputeCells computes the cells for a given blob. +func gokzgComputeCells(blob *Blob) ([]Cell, error) { + gokzgIniter.Do(gokzgInit) + + results, err := context.ComputeCells((*gokzg4844.Blob)(blob), 0) + if err != nil { + return nil, err + } + + cells := make([]Cell, len(results)) + for i, result := range results { + cells[i] = (Cell)(*result) + } + + return cells, nil +} + +// gokzgComputeCellsAndKZGProofs computes the cells and KZG proofs for a given blob. +func gokzgComputeCellsAndKZGProofs(blob *Blob) ([]Cell, []Proof, error) { + gokzgIniter.Do(gokzgInit) + + cellResults, proofResults, err := context.ComputeCellsAndKZGProofs((*gokzg4844.Blob)(blob), 0) + if err != nil { + return nil, nil, err + } + + cells := make([]Cell, len(cellResults)) + for i, cell := range cellResults { + cells[i] = (Cell)(*cell) + } + + proofs := make([]Proof, len(proofResults)) + for i, proof := range proofResults { + proofs[i] = (Proof)(proof) + } + + return cells, proofs, nil +} diff --git a/crypto/kzg4844/kzg4844_test.go b/crypto/kzg4844/kzg4844_test.go index a6782d4768..7fa261e523 100644 --- a/crypto/kzg4844/kzg4844_test.go +++ b/crypto/kzg4844/kzg4844_test.go @@ -21,7 +21,7 @@ import ( "testing" "github.com/consensys/gnark-crypto/ecc/bls12-381/fr" - gokzg4844 "github.com/crate-crypto/go-kzg-4844" + gokzg4844 "github.com/crate-crypto/go-eth-kzg" ) func randFieldElement() [32]byte { diff --git a/go.mod b/go.mod index 5ec51dd1ea..1c76320f7f 100644 --- a/go.mod +++ b/go.mod @@ -13,15 +13,15 @@ require ( github.com/cespare/cp v0.1.0 github.com/cloudflare/cloudflare-go v0.114.0 github.com/cockroachdb/pebble v1.1.2 - github.com/consensys/gnark-crypto v0.14.0 + github.com/consensys/gnark-crypto v0.17.0 + github.com/crate-crypto/go-eth-kzg v1.3.0 github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a - github.com/crate-crypto/go-kzg-4844 v1.1.0 github.com/davecgh/go-spew v1.1.1 github.com/deckarep/golang-set/v2 v2.6.0 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0 github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3 - github.com/ethereum/c-kzg-4844 v1.0.0 + github.com/ethereum/c-kzg-4844/v2 v2.1.0 github.com/ethereum/go-verkle v0.2.2 github.com/fatih/color v1.16.0 github.com/ferranbt/fastssz v0.1.2 @@ -66,8 +66,8 @@ require ( go.uber.org/goleak v1.3.0 golang.org/x/crypto v0.35.0 golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df - golang.org/x/sync v0.11.0 - golang.org/x/sys v0.30.0 + golang.org/x/sync v0.12.0 + golang.org/x/sys v0.31.0 golang.org/x/text v0.22.0 golang.org/x/time v0.9.0 golang.org/x/tools v0.29.0 @@ -91,14 +91,14 @@ require ( github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect github.com/aws/smithy-go v1.15.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.17.0 // indirect + github.com/bits-and-blooms/bitset v1.22.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cockroachdb/errors v1.11.3 // indirect github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/consensys/bavard v0.1.22 // indirect + github.com/consensys/bavard v0.1.30 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect github.com/deepmap/oapi-codegen v1.6.0 // indirect github.com/dlclark/regexp2 v1.7.0 // indirect diff --git a/go.sum b/go.sum index 40800ed257..41c8ca52c8 100644 --- a/go.sum +++ b/go.sum @@ -90,8 +90,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.17.0 h1:1X2TS7aHz1ELcC0yU1y2stUs/0ig5oMU6STFZGrhvHI= -github.com/bits-and-blooms/bitset v1.17.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= +github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -124,16 +124,16 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/consensys/bavard v0.1.22 h1:Uw2CGvbXSZWhqK59X0VG/zOjpTFuOMcPLStrp1ihI0A= -github.com/consensys/bavard v0.1.22/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= -github.com/consensys/gnark-crypto v0.14.0 h1:DDBdl4HaBtdQsq/wfMwJvZNE80sHidrK3Nfrefatm0E= -github.com/consensys/gnark-crypto v0.14.0/go.mod h1:CU4UijNPsHawiVGNxe9co07FkzCeWHHrb1li/n1XoU0= +github.com/consensys/bavard v0.1.30 h1:wwAj9lSnMLFXjEclKwyhf7Oslg8EoaFz9u1QGgt0bsk= +github.com/consensys/bavard v0.1.30/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.17.0 h1:vKDhZMOrySbpZDCvGMOELrHFv/A9mJ7+9I8HEfRZSkI= +github.com/consensys/gnark-crypto v0.17.0/go.mod h1:A2URlMHUT81ifJ0UlLzSlm7TmnE3t7VxEThApdMukJw= github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-eth-kzg v1.3.0 h1:05GrhASN9kDAidaFJOda6A4BEvgvuXbazXg/0E3OOdI= +github.com/crate-crypto/go-eth-kzg v1.3.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= -github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= -github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -164,8 +164,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844/v2 v2.1.0 h1:gQropX9YFBhl3g4HYhwE70zq3IHFRgbbNPw0Shwzf5w= +github.com/ethereum/c-kzg-4844/v2 v2.1.0/go.mod h1:TC48kOKjJKPbN7C++qIgt0TJzZ70QznYR7Ob+WXl57E= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= @@ -640,8 +640,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -705,8 +705,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=