Skip to content

Commit

Permalink
update kzg lib to latest (ethereum#118)
Browse files Browse the repository at this point in the history
* update kzg lib to latest

* add check of len(proofs) per free the blobs

* fix type / typo bugs

* use test factory for blob wrapper test data
  • Loading branch information
roberto-bayardo committed Apr 17, 2023
1 parent fef4acf commit d0b90b3
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 82 deletions.
33 changes: 17 additions & 16 deletions core/types/data_blob.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"fmt"
"io"

"github.com/crate-crypto/go-proto-danksharding-crypto/serialization"
gokzg4844 "github.com/crate-crypto/go-kzg-4844"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto/kzg"
Expand Down Expand Up @@ -51,7 +51,7 @@ func (p *KZGCommitment) UnmarshalText(text []byte) error {
}

func (c KZGCommitment) ComputeVersionedHash() common.Hash {
return common.Hash(kzg.KZGToVersionedHash(serialization.KZGCommitment(c)))
return common.Hash(kzg.KZGToVersionedHash(gokzg4844.KZGCommitment(c)))
}

// Compressed BLS12-381 G1 element
Expand Down Expand Up @@ -267,41 +267,41 @@ func (blobs Blobs) ComputeCommitmentsAndProofs() (commitments []KZGCommitment, v

cryptoCtx := kzg.CrpytoCtx()
for i, blob := range blobs {
commitment, err := cryptoCtx.BlobToKZGCommitment(serialization.Blob(blob))
commitment, err := cryptoCtx.BlobToKZGCommitment(gokzg4844.Blob(blob))
if err != nil {
return nil, nil, nil, fmt.Errorf("could not convert blob to commitment: %v", err)
}

proof, err := cryptoCtx.ComputeBlobKZGProof(serialization.Blob(blob), commitment)
proof, err := cryptoCtx.ComputeBlobKZGProof(gokzg4844.Blob(blob), commitment)
if err != nil {
return nil, nil, nil, fmt.Errorf("could not compute proof for blob: %v", err)
}
commitments[i] = KZGCommitment(commitment)
proofs[i] = KZGProof(proof)
versionedHashes[i] = common.Hash(kzg.KZGToVersionedHash(serialization.KZGCommitment(commitment)))
versionedHashes[i] = common.Hash(kzg.KZGToVersionedHash(gokzg4844.KZGCommitment(commitment)))
}

return commitments, versionedHashes, proofs, nil
}

func toBlobs(_blobs Blobs) []serialization.Blob {
blobs := make([]serialization.Blob, len(_blobs))
func toBlobs(_blobs Blobs) []gokzg4844.Blob {
blobs := make([]gokzg4844.Blob, len(_blobs))
for i, _blob := range _blobs {
blobs[i] = serialization.Blob(_blob)
blobs[i] = gokzg4844.Blob(_blob)
}
return blobs
}
func toComms(_comms BlobKzgs) []serialization.KZGCommitment {
comms := make([]serialization.KZGCommitment, len(_comms))
func toComms(_comms BlobKzgs) []gokzg4844.KZGCommitment {
comms := make([]gokzg4844.KZGCommitment, len(_comms))
for i, _comm := range _comms {
comms[i] = serialization.KZGCommitment(_comm)
comms[i] = gokzg4844.KZGCommitment(_comm)
}
return comms
}
func toProofs(_proofs KZGProofs) []serialization.KZGProof {
proofs := make([]serialization.KZGProof, len(_proofs))
func toProofs(_proofs KZGProofs) []gokzg4844.KZGProof {
proofs := make([]gokzg4844.KZGProof, len(_proofs))
for i, _proof := range _proofs {
proofs[i] = serialization.KZGProof(_proof)
proofs[i] = gokzg4844.KZGProof(_proof)
}
return proofs
}
Expand Down Expand Up @@ -349,8 +349,9 @@ func (b *BlobTxWrapData) validateBlobTransactionWrapper(inner TxData) error {
l1 := len(b.BlobKzgs)
l2 := len(blobTx.Message.BlobVersionedHashes)
l3 := len(b.Blobs)
if l1 != l2 || l2 != l3 {
return fmt.Errorf("lengths don't match %v %v %v", l1, l2, l3)
l4 := len(b.Proofs)
if l1 != l2 || l1 != l3 || l1 != l4 {
return fmt.Errorf("lengths don't match %v %v %v %v", l1, l2, l3, l4)
}
// the following check isn't strictly necessary as it would be caught by data gas processing
// (and hence it is not explicitly in the spec for this function), but it doesn't hurt to fail
Expand Down
30 changes: 12 additions & 18 deletions core/types/transaction_signing_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import (
"math/big"
"testing"

"github.com/crate-crypto/go-proto-danksharding-crypto/api"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/rlp"
Expand Down Expand Up @@ -85,23 +84,18 @@ func TestEIP4844Signing(t *testing.T) {
addr := crypto.PubkeyToAddress(key.PublicKey)

signer := NewDankSigner(big.NewInt(18))
txdata := &SignedBlobTx{
Message: BlobTxMessage{
Nonce: view.Uint64View(0),
Gas: view.Uint64View(123457),
To: AddressOptionalSSZ{Address: (*AddressSSZ)(&addr)},
GasTipCap: view.Uint256View(*uint256.NewInt(42)),
GasFeeCap: view.Uint256View(*uint256.NewInt(10)),
MaxFeePerDataGas: view.Uint256View(*uint256.NewInt(10)),
Value: view.Uint256View(*uint256.NewInt(10)),
BlobVersionedHashes: VersionedHashesView{common.HexToHash("0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014")},
},
}
wrapData := &BlobTxWrapData{
BlobKzgs: BlobKzgs{KZGCommitment{0: 0xc0}},
Blobs: Blobs{Blob{}},
Proofs: KZGProofs{api.ZERO_POINT},
}
msg := BlobTxMessage{
Nonce: view.Uint64View(0),
Gas: view.Uint64View(123457),
To: AddressOptionalSSZ{Address: (*AddressSSZ)(&addr)},
GasTipCap: view.Uint256View(*uint256.NewInt(42)),
GasFeeCap: view.Uint256View(*uint256.NewInt(10)),
MaxFeePerDataGas: view.Uint256View(*uint256.NewInt(10)),
Value: view.Uint256View(*uint256.NewInt(10)),
}
var wrapData TxWrapData
wrapData, msg.BlobVersionedHashes = oneEmptyBlobWrapData()
txdata := &SignedBlobTx{Message: msg}
tx := NewTx(txdata, WithTxWrapData(wrapData))
tx, err := SignTx(tx, signer, key)
if err != nil {
Expand Down
42 changes: 26 additions & 16 deletions core/types/transaction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,13 @@ import (
"testing"
"time"

"github.com/crate-crypto/go-proto-danksharding-crypto/api"
gokzg4844 "github.com/crate-crypto/go-kzg-4844"
"github.com/holiman/uint256"
"github.com/protolambda/ztyp/view"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/crypto/kzg"
"github.com/ethereum/go-ethereum/rlp"
)

Expand Down Expand Up @@ -77,6 +78,21 @@ var (
)
)

// Returns a wrapper consisting of a single blob of all zeros that passes validation along with its
// versioned hash.
func oneEmptyBlobWrapData() (wrap *BlobTxWrapData, versionedHashes VersionedHashesView) {
cryptoCtx := kzg.CrpytoCtx()
blob := Blob{}
commitment, _ := cryptoCtx.BlobToKZGCommitment(gokzg4844.Blob(blob))
proof, _ := cryptoCtx.ComputeBlobKZGProof(gokzg4844.Blob(blob), commitment)
wrapData := &BlobTxWrapData{
BlobKzgs: BlobKzgs{KZGCommitment(commitment)},
Blobs: Blobs{Blob(blob)},
Proofs: KZGProofs{KZGProof(proof)},
}
return wrapData, VersionedHashesView{common.Hash(kzg.KZGToVersionedHash(gokzg4844.KZGCommitment(wrapData.BlobKzgs[0])))}
}

func TestDecodeEmptyTypedTx(t *testing.T) {
input := []byte{0x80}
var tx Transaction
Expand Down Expand Up @@ -482,22 +498,16 @@ func TestTransactionCoding(t *testing.T) {
AccessList: accesses,
}
case 6:
txdata = &SignedBlobTx{
Message: BlobTxMessage{
ChainID: view.Uint256View(*uint256.NewInt(1)),
Nonce: view.Uint64View(i),
Gas: view.Uint64View(123457),
GasTipCap: view.Uint256View(*uint256.NewInt(42)),
GasFeeCap: view.Uint256View(*uint256.NewInt(10)),
AccessList: AccessListView(accesses),
BlobVersionedHashes: VersionedHashesView{common.HexToHash("0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014")},
},
}
wrapData = &BlobTxWrapData{
BlobKzgs: BlobKzgs{KZGCommitment{0: 0xc0}},
Blobs: Blobs{Blob{}},
Proofs: KZGProofs{api.ZERO_POINT},
msg := BlobTxMessage{
ChainID: view.Uint256View(*uint256.NewInt(1)),
Nonce: view.Uint64View(i),
Gas: view.Uint64View(123457),
GasTipCap: view.Uint256View(*uint256.NewInt(42)),
GasFeeCap: view.Uint256View(*uint256.NewInt(10)),
AccessList: AccessListView(accesses),
}
wrapData, msg.BlobVersionedHashes = oneEmptyBlobWrapData()
txdata = &SignedBlobTx{Message: msg}
}
tx, err := SignNewTx(key, signer, txdata, WithTxWrapData(wrapData))
if err != nil {
Expand Down
27 changes: 13 additions & 14 deletions crypto/kzg/kzg.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ import (
"math/big"
"sync"

"github.com/crate-crypto/go-proto-danksharding-crypto/api"
"github.com/crate-crypto/go-proto-danksharding-crypto/serialization"
gokzg4844 "github.com/crate-crypto/go-kzg-4844"
)

const (
Expand All @@ -23,8 +22,8 @@ type Slot uint64
type BlobsSidecar struct {
BeaconBlockRoot Root
BeaconBlockSlot Slot
Blobs []serialization.Blob
Proofs []serialization.KZGProof
Blobs []gokzg4844.Blob
Proofs []gokzg4844.KZGProof
}

const (
Expand All @@ -40,30 +39,30 @@ var (
// The value that gets returned when the `verify_kzg_proof“ precompile is called
var precompileReturnValue [64]byte

var gCryptoCtx api.Context
var gCryptoCtx gokzg4844.Context
var initCryptoCtx sync.Once

// InitializeCrypytoCtx initializes the global context object returned via CryptoCtx
func InitializeCrypytoCtx() {
initCryptoCtx.Do(func() {
// Initialize context to match the configurations that the
// specs are using.
ctx, err := api.NewContext4096Insecure1337()
ctx, err := gokzg4844.NewContext4096Insecure1337()
if err != nil {
panic(fmt.Sprintf("could not create context, err : %v", err))
}
gCryptoCtx = *ctx
// Initialize the precompile return value
new(big.Int).SetUint64(serialization.ScalarsPerBlob).FillBytes(precompileReturnValue[:32])
copy(precompileReturnValue[32:], api.MODULUS[:])
new(big.Int).SetUint64(gokzg4844.ScalarsPerBlob).FillBytes(precompileReturnValue[:32])
copy(precompileReturnValue[32:], gokzg4844.BlsModulus[:])
})
}

// CryptoCtx returns a context object stores all of the necessary configurations
// to allow one to create and verify blob proofs.
// This function is expensive to run if the crypto context isn't initialized, so it is recommended to
// pre-initialize by calling InitializeCryptoCtx
func CrpytoCtx() api.Context {
func CrpytoCtx() gokzg4844.Context {
InitializeCrypytoCtx()
return gCryptoCtx
}
Expand All @@ -77,7 +76,7 @@ func PointEvaluationPrecompile(input []byte) ([]byte, error) {
var versionedHash [32]byte
copy(versionedHash[:], input[:32])

var x, y [32]byte
var x, y gokzg4844.Scalar
// Evaluation point: next 32 bytes
copy(x[:], input[32:64])
// Expected output: next 32 bytes
Expand All @@ -86,16 +85,16 @@ func PointEvaluationPrecompile(input []byte) ([]byte, error) {
// input kzg point: next 48 bytes
var dataKZG [48]byte
copy(dataKZG[:], input[96:144])
if KZGToVersionedHash(serialization.KZGCommitment(dataKZG)) != VersionedHash(versionedHash) {
if KZGToVersionedHash(gokzg4844.KZGCommitment(dataKZG)) != VersionedHash(versionedHash) {
return nil, errors.New("mismatched versioned hash")
}

// Quotient kzg: next 48 bytes
var quotientKZG [48]byte
var quotientKZG gokzg4844.KZGProof
copy(quotientKZG[:], input[144:PrecompileInputLength])

cryptoCtx := CrpytoCtx()
err := cryptoCtx.VerifyKZGProof(dataKZG, quotientKZG, x, y)
err := cryptoCtx.VerifyKZGProof(dataKZG, x, y, quotientKZG)
if err != nil {
return nil, fmt.Errorf("verify_kzg_proof error: %v", err)
}
Expand All @@ -106,7 +105,7 @@ func PointEvaluationPrecompile(input []byte) ([]byte, error) {
}

// KZGToVersionedHash implements kzg_to_versioned_hash from EIP-4844
func KZGToVersionedHash(kzg serialization.KZGCommitment) VersionedHash {
func KZGToVersionedHash(kzg gokzg4844.KZGCommitment) VersionedHash {
h := sha256.Sum256(kzg[:])
h[0] = BlobCommitmentVersionKZG

Expand Down
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ require (
github.com/cespare/cp v0.1.0
github.com/cloudflare/cloudflare-go v0.14.0
github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811
github.com/consensys/gnark-crypto v0.9.1-0.20230105202408-1a7a29904a7c
github.com/consensys/gnark-crypto v0.10.0
github.com/crate-crypto/go-kzg-4844 v0.1.0
github.com/davecgh/go-spew v1.1.1
github.com/deckarep/golang-set/v2 v2.1.0
github.com/docker/docker v1.6.2
Expand Down Expand Up @@ -62,15 +63,13 @@ require (
golang.org/x/crypto v0.1.0
golang.org/x/exp v0.0.0-20230206171751-46f607a40771
golang.org/x/sync v0.1.0
golang.org/x/sys v0.5.0
golang.org/x/sys v0.6.0
golang.org/x/text v0.7.0
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af
golang.org/x/tools v0.2.0
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce
)

require github.com/crate-crypto/go-proto-danksharding-crypto v0.0.0-20230325161441-829bf646183d

require (
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 // indirect
Expand All @@ -82,6 +81,7 @@ require (
github.com/aws/aws-sdk-go-v2/service/sts v1.1.1 // indirect
github.com/aws/smithy-go v1.1.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bits-and-blooms/bitset v1.5.0 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cockroachdb/errors v1.9.1 // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
Expand Down
22 changes: 8 additions & 14 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,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.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8=
github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c=
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k=
Expand Down Expand Up @@ -105,8 +107,8 @@ github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZ
github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM=
github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ=
github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
github.com/consensys/gnark-crypto v0.9.1-0.20230105202408-1a7a29904a7c h1:llSLg4o9EgH3SrXky+Q5BqEYqV76NGKo07K5Ps2pIKo=
github.com/consensys/gnark-crypto v0.9.1-0.20230105202408-1a7a29904a7c/go.mod h1:CkbdF9hbRidRJYMRzmfX8TMOr95I2pYXRHF18MzRrvA=
github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA=
github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
Expand All @@ -116,16 +118,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHH
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7 h1:6IrxszG5G+O7zhtkWxq6+unVvnrm1fqV2Pe+T95DUzw=
github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI=
github.com/crate-crypto/go-proto-danksharding-crypto v0.0.0-20230312204821-9a244123c812 h1:fvpzeIO449sb44y2Nqd0MVziJHvp0OFCG66t3ZjuYqU=
github.com/crate-crypto/go-proto-danksharding-crypto v0.0.0-20230312204821-9a244123c812/go.mod h1:ZNzUrSnC7IXKtQWnROzWVfQSivVSCPkMtwXekLDj4qI=
github.com/crate-crypto/go-proto-danksharding-crypto v0.0.0-20230322232037-070b0b94db8a h1:LWAQVosZamsfhvO14tfYNMluSHTWXF6AKa+9DmaK7Q0=
github.com/crate-crypto/go-proto-danksharding-crypto v0.0.0-20230322232037-070b0b94db8a/go.mod h1:ZNzUrSnC7IXKtQWnROzWVfQSivVSCPkMtwXekLDj4qI=
github.com/crate-crypto/go-proto-danksharding-crypto v0.0.0-20230322232628-fbbf54e10131 h1:/ZBvP82vNl+xWYfcAHewbjRkq1MS2l0DKyeIWO4wgME=
github.com/crate-crypto/go-proto-danksharding-crypto v0.0.0-20230322232628-fbbf54e10131/go.mod h1:ZNzUrSnC7IXKtQWnROzWVfQSivVSCPkMtwXekLDj4qI=
github.com/crate-crypto/go-proto-danksharding-crypto v0.0.0-20230322233247-22e22c6f68e6 h1:KguBkZjb4BXvSmVxjugrmJQyGjZqZHJfGHMmHgZn6ls=
github.com/crate-crypto/go-proto-danksharding-crypto v0.0.0-20230322233247-22e22c6f68e6/go.mod h1:ZNzUrSnC7IXKtQWnROzWVfQSivVSCPkMtwXekLDj4qI=
github.com/crate-crypto/go-proto-danksharding-crypto v0.0.0-20230325161441-829bf646183d h1:rFbq+iU1Evnzs//EjFY7bUcIn4+/gdczDfx+PSMmvTE=
github.com/crate-crypto/go-proto-danksharding-crypto v0.0.0-20230325161441-829bf646183d/go.mod h1:ZNzUrSnC7IXKtQWnROzWVfQSivVSCPkMtwXekLDj4qI=
github.com/crate-crypto/go-kzg-4844 v0.1.0 h1:2PXr2wKBNTmSsoYLCmaNg5Z6uQUf7LiUAsnDbTfq+0M=
github.com/crate-crypto/go-kzg-4844 v0.1.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4=
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/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
Expand Down Expand Up @@ -732,8 +726,8 @@ golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand Down

0 comments on commit d0b90b3

Please sign in to comment.