Skip to content

Commit

Permalink
Merge pull request #1 from Layr-Labs/encoding-lib
Browse files Browse the repository at this point in the history
Encoding lib
  • Loading branch information
bxue-l2 authored Jun 2, 2023
2 parents a45a670 + 44a5ccc commit e0d36a0
Show file tree
Hide file tree
Showing 31 changed files with 366 additions and 651 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
test/resources/kzg/*
test/resources/kzg/*
26 changes: 12 additions & 14 deletions core/assignment.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@ type OperatorIndex uint

type ChunkIndex uint

type Assignments struct {
type AssignmentInfo struct {
StakeThreshold uint
NumChunks uint
Assignments []Assignment
TotalChunks uint
}

type Assignment struct {
Expand All @@ -35,9 +34,9 @@ func (c *Assignment) GetIndices() []ChunkIndex {
}

type AssignmentCoordinator interface {
GetAssignments(state OperatorState, quorum QuorumParams) (Assignments, error)
GetAssignments(state OperatorState, quorum QuorumParams) ([]Assignment, AssignmentInfo, error)

GetOperatorAssignment(state OperatorState, quorum QuorumParams, id OperatorId) (Assignment, error)
GetOperatorAssignment(state OperatorState, quorum QuorumParams, id OperatorId) (Assignment, AssignmentInfo, error)

ValidateConglomerateChunkSize(state OperatorState, headers []BlobHeader, chunkSize uint) error

Expand Down Expand Up @@ -77,7 +76,7 @@ func getStakeThreshold(state OperatorState, quorum QuorumParams) uint {
return uint(stakeThreshold.Uint64())
}

func (c *BasicAssignmentCoordinator) GetAssignments(state OperatorState, quorum QuorumParams) (Assignments, error) {
func (c *BasicAssignmentCoordinator) GetAssignments(state OperatorState, quorum QuorumParams) ([]Assignment, AssignmentInfo, error) {

numOperators := len(state.Operators)
numOperatorsBig := new(big.Int).SetUint64(uint64(numOperators))
Expand Down Expand Up @@ -118,10 +117,9 @@ func (c *BasicAssignmentCoordinator) GetAssignments(state OperatorState, quorum

stakeThreshold := getStakeThreshold(state, quorum)

return Assignments{
return assignments, AssignmentInfo{
StakeThreshold: stakeThreshold,
NumChunks: numChunks,
Assignments: assignments,
TotalChunks: numChunks,
}, nil

}
Expand All @@ -142,19 +140,19 @@ func GetOperatorAtIndex(headerHash [32]byte, index, numOperators int) int {
return int(operatorIndex.Uint64())
}

func (c *BasicAssignmentCoordinator) GetOperatorAssignment(state OperatorState, quorum QuorumParams, id OperatorId) (Assignment, error) {
func (c *BasicAssignmentCoordinator) GetOperatorAssignment(state OperatorState, quorum QuorumParams, id OperatorId) (Assignment, AssignmentInfo, error) {

assignments, err := c.GetAssignments(state, quorum)
assignments, info, err := c.GetAssignments(state, quorum)
if err != nil {
return Assignment{}, err
return Assignment{}, AssignmentInfo{}, err
}

operator, ok := state.OperatorMap[id]
if !ok {
return Assignment{}, ErrNotFound
return Assignment{}, AssignmentInfo{}, ErrNotFound
}

return assignments.Assignments[operator.Index], nil
return assignments[operator.Index], info, nil
}

func (c *BasicAssignmentCoordinator) ValidateConglomerateChunkSize(state OperatorState, headers []BlobHeader, chunkSize uint) error {
Expand Down
32 changes: 22 additions & 10 deletions core/data.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,36 @@ type BlobHeader struct {
// Conglomerate

type Conglomerate interface {
Header() ConglomerateHeader
Data() [][]byte
ProveInclusion(header BlobHeader, index uint) error
}

type ConglomerateCommitments struct {
Commitment Commitment
DegreeProof Commitment
Degree uint
}

type ConglomerateHeader struct {
Commitment Commitment
DegreeProof Commitment
Degree uint
ChunkSize uint
NumOperators uint
NumBlobs uint
Quorum QuorumParams
ReferenceBlockNumber uint
}

func (h ConglomerateHeader) Commitments() ConglomerateCommitments {
return ConglomerateCommitments{
Commitment: h.Commitment,
DegreeProof: h.DegreeProof,
Degree: h.Degree,
}
}

// Batch

type Batch struct {
Expand All @@ -53,20 +70,15 @@ type HeaderBatch struct {
// Chunks

type Chunk struct {
Header ConglomerateHeader
Data ChunkData
Proof Proof
Data ChunkData
Proof Proof
}

type ChunkData interface {
}
type ChunkData interface{}

type Proof interface {
Verify(data ChunkData, commitment Commitment, indices []ChunkIndex) error
}
type Proof interface{}

type Commitment interface {
}
type Commitment interface{}

type ChunkBatch struct {
Chunks []Chunk
Expand Down
7 changes: 2 additions & 5 deletions core/encoding.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@ type EncodingParams struct {
NumChunks uint
}

type EncodingGroup interface {
GetEncoder(params EncodingParams) Encoder
}

type Encoder interface {
Encode(conglom Conglomerate) ([]ChunkBatch, error)
Encode(data [][]byte, params EncodingParams) (ConglomerateCommitments, []ChunkBatch, error)
VerifyChunks(chunks []Chunk, indices []ChunkIndex, commitments ConglomerateCommitments, params EncodingParams) error
}
Empty file removed core/encoding/.keep
Empty file.
108 changes: 108 additions & 0 deletions core/encoding/encoder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package encoding

import (
"errors"

"github.com/Layr-Labs/eigenda/core"
enc "github.com/Layr-Labs/eigenda/pkg/encoding/encoder"
kzgEnc "github.com/Layr-Labs/eigenda/pkg/encoding/kzgEncoder"
"github.com/Layr-Labs/eigenda/pkg/kzg/bn254"
)

var (
ErrConglomFeatureNotSupported = errors.New("conglomerate feature not supported")
)

type Conglomerate struct {
data [][]byte
header core.ConglomerateHeader
}

func (c *Conglomerate) Data() [][]byte {
return c.data
}

func (c *Conglomerate) Header() core.ConglomerateHeader {
return c.header
}

func toEncParams(params core.EncodingParams) enc.EncodingParams {
return enc.EncodingParams{
NumChunks: uint64(params.NumChunks),
ChunkLen: uint64(params.ChunkSize),
}
}

type Encoder struct {
EncoderGroup kzgEnc.KzgEncoderGroup
}

func (e *Encoder) Encode(data [][]byte, params core.EncodingParams) (core.ConglomerateCommitments, []core.Chunk, error) {

encParams := toEncParams(params)

encoder, err := e.EncoderGroup.GetKzgEncoder(encParams)
if err != nil {
return core.ConglomerateCommitments{}, nil, err
}
if len(data) != 1 {
return core.ConglomerateCommitments{}, nil, ErrConglomFeatureNotSupported
}

blob := data[0]

commit, lowDegreeProof, kzgFrames, _, err := encoder.EncodeBytes(blob)
if err != nil {
return core.ConglomerateCommitments{}, nil, ErrConglomFeatureNotSupported
}

chunks := make([]core.Chunk, len(kzgFrames))
for ind, frame := range kzgFrames {

chunks[ind] = core.Chunk{
Data: frame.Coeffs,
Proof: frame.Proof,
}

}

degree := uint(len(enc.ToFrArray(blob)))
commitments := core.ConglomerateCommitments{
Commitment: commit,
DegreeProof: lowDegreeProof,
Degree: degree,
}

return commitments, chunks, nil

}

func (e *Encoder) VerifyChunks(chunks []core.Chunk, indices []core.ChunkIndex, commitments core.ConglomerateCommitments, params core.EncodingParams) error {

encParams := toEncParams(params)

verifier, err := e.EncoderGroup.GetKzgVerifier(encParams)
if err != nil {
return err
}

err = verifier.VerifyCommit(commitments.Commitment.(*bn254.G1Point), commitments.DegreeProof.(*bn254.G1Point), uint64(commitments.Degree))
if err != nil {
return err
}

for ind := range chunks {
err = verifier.VerifyFrame(
commitments.Commitment.(*bn254.G1Point),
chunks[ind].Data.(*kzgEnc.Frame),
uint64(indices[ind]),
)

if err != nil {
return err
}
}

return nil

}
8 changes: 3 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,21 @@ module github.com/Layr-Labs/eigenda
go 1.19

require (
github.com/consensys/gnark-crypto v0.11.0
github.com/ethereum/go-ethereum v1.12.0
github.com/consensys/gnark-crypto v0.8.0
github.com/ethereum/go-ethereum v1.10.26
github.com/stretchr/testify v1.8.3
)

require (
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect
github.com/bits-and-blooms/bitset v1.7.0 // indirect
github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
github.com/consensys/bavard v0.1.13 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/deckarep/golang-set/v2 v2.1.0 // indirect
github.com/deckarep/golang-set v1.8.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/go-ole/go-ole v1.2.1 // indirect
github.com/go-stack/stack v1.8.1 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c // indirect
github.com/mmcloughlin/addchain v0.4.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
Expand Down
44 changes: 9 additions & 35 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,65 +1,42 @@
github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo=
github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k=
github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk=
github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ=
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
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.11.0 h1:QqzHQlwEqlQr5jfWblGDkwlKHpT+4QodYqqExkAtyks=
github.com/consensys/gnark-crypto v0.11.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU=
github.com/consensys/gnark-crypto v0.8.0 h1:HHmhTEzHq6k/fJroPGzq8Biafn2X2IFKlKDhaL5gMHU=
github.com/consensys/gnark-crypto v0.8.0/go.mod h1:ZTnSzNlt98CpwYIJyk6q/KVcshYWr3fOXXFrrY8a0QQ=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI=
github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4=
github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo=
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
github.com/ethereum/go-ethereum v1.12.0 h1:bdnhLPtqETd4m3mS8BGMNvBTf36bO5bx/hxE2zljOa0=
github.com/ethereum/go-ethereum v1.12.0/go.mod h1:/oo2X/dZLJjf2mJ6YT9wcWxa4nNJDBKDBU6sFIpx1Gs=
github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0=
github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s=
github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg=
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8=
github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw=
github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=
github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI=
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
Expand All @@ -71,12 +48,9 @@ github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefld
github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM=
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg=
golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
Expand Down
Loading

0 comments on commit e0d36a0

Please sign in to comment.