dkg

package
v0.0.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 14, 2020 License: Apache-2.0 Imports: 20 Imported by: 0

Documentation

Overview

Copyright © 2019 Annchain Authors <EMAIL ADDRESS>

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright © 2019 Annchain Authors <EMAIL ADDRESS>

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GenPartnerPair

func GenPartnerPair(suite *bn256.Suite) (kyber.Scalar, kyber.Point)

GenPartnerPair generates a part private/public key for discussing with others.

func InitLoggers

func InitLoggers(logger *logrus.Logger, logdir string)

Types

type DefaultDkgPartner

type DefaultDkgPartner struct {
	DealResponseCache map[int]*dkger.Response //my response for such deal should not be generated twice
	ResponseCache     map[string]bool         // duplicate response should not be processed twice.
	// contains filtered or unexported fields
}

DefaultDkgPartner is the parter in a DKG group built to discuss a pub/privkey It will receive DKG messages and update the status. It is the handler for maintaining the DkgContext. Campaign or term change is not part of DKGPartner. Do their job in their own module.

func NewDefaultDkgPartner

func NewDefaultDkgPartner(suite *bn256.Suite, termId uint32, numParts, threshold int, allPeers []PartPub, me PartSec,
	dkgPeerCommunicatorIncoming DkgPeerCommunicatorIncoming,
	dkgPeerCommunicatorOutgoing DkgPeerCommunicatorOutgoing) (*DefaultDkgPartner, error)

NewDefaultDkgPartner inits a dkg group. All public keys should be already generated The public keys are shared before the Dkg group can be formed. This may be done by publishing partPub to the blockchain termId is still needed to identify different Dkg groups allPeers needs to be sorted and globally order identical

func (*DefaultDkgPartner) GetDkgPeerCommunicatorIncoming

func (p *DefaultDkgPartner) GetDkgPeerCommunicatorIncoming() DkgPeerCommunicatorIncoming

func (*DefaultDkgPartner) RegisterDkgGeneratedListener

func (p *DefaultDkgPartner) RegisterDkgGeneratedListener(l DkgGeneratedListener)

func (*DefaultDkgPartner) Start

func (p *DefaultDkgPartner) Start()

func (*DefaultDkgPartner) Stop

func (p *DefaultDkgPartner) Stop()

type DisorderedCache

type DisorderedCache map[uint32]Stagable

DisorderedCache collects necessary prerequisites to make message in order

type DkgBasicInfo

type DkgBasicInfo struct {
	TermId uint32
	Height uint64
}

func (*DkgBasicInfo) DecodeMsg

func (z *DkgBasicInfo) DecodeMsg(dc *msgp.Reader) (err error)

DecodeMsg implements msgp.Decodable

func (DkgBasicInfo) EncodeMsg

func (z DkgBasicInfo) EncodeMsg(en *msgp.Writer) (err error)

EncodeMsg implements msgp.Encodable

func (DkgBasicInfo) MarshalMsg

func (z DkgBasicInfo) MarshalMsg(b []byte) (o []byte, err error)

MarshalMsg implements msgp.Marshaler

func (DkgBasicInfo) Msgsize

func (z DkgBasicInfo) Msgsize() (s int)

Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message

func (*DkgBasicInfo) ProvideHeight

func (d *DkgBasicInfo) ProvideHeight() uint64

func (*DkgBasicInfo) UnmarshalMsg

func (z *DkgBasicInfo) UnmarshalMsg(bts []byte) (o []byte, err error)

UnmarshalMsg implements msgp.Unmarshaler

type DkgContext

type DkgContext struct {
	SessionId uint32
	MyIndex   uint32
	Me        PartSec
	PartPubs  []PartPub // must be ordered from the outside

	//CandidatePartSec      []kyber.Scalar
	//CandidatePublicKey    [][]byte
	//addressIndex          map[common.Address]int
	//SecretKeyContribution map[common.Address]kyber.Scalar
	Suite *bn256.Suite
	Dkger *dkg.DistKeyGenerator // backend algorithm
	//Resps                 map[common.Address]*dkg.Response
	//dealsIndex            map[uint32]bool
	Threshold      int
	NbParticipants int
	JointPubKey    kyber.Point
	//responseNumber        int
	//SigShares [][]byte
	KeyShare *dkg.DistKeyShare // cache of the DistKeyShare to avoid recovery multiple times
}

DkgContext stores the DKG info collected from other peers. It can sign messages individually and recover the joint sig once enough peers share their partSigs It is the core algorithm of DKG

func NewDkgContext

func NewDkgContext(s *bn256.Suite, termId uint32) *DkgContext

func (*DkgContext) GenerateDKGer

func (p *DkgContext) GenerateDKGer() error

GenerateDKGer inits a dkg by all part-public keys and my part-private key Then it is possible to sign and verify data.

func (*DkgContext) PartSig

func (p *DkgContext) PartSig(msg []byte) (partSig []byte, err error)

PartSig signs the message into a single sigShare.

func (*DkgContext) RecoverPub

func (p *DkgContext) RecoverPub() (jointPubKey kyber.Point, err error)

RecoverPub builds a joint public key from keyshares collected from all other participants

func (*DkgContext) RecoverSig

func (p *DkgContext) RecoverSig(msg []byte, sigShares [][]byte) (jointSig []byte, err error)

RecoverSig builds a jointSignature from sigShares collected from enough participants

func (*DkgContext) VerifyByDksPublic

func (p *DkgContext) VerifyByDksPublic(msg []byte, sig []byte) (err error)

VerifyByDksPublic verifies signature for msg

func (*DkgContext) VerifyByPubPoly

func (p *DkgContext) VerifyByPubPoly(msg []byte, sig []byte) (err error)

VerifyByPubPoly verifies signature for msg

type DkgDiscussion

type DkgDiscussion struct {
	Deal      *dkg.Deal
	Responses []*dkg.Response
}

func (*DkgDiscussion) GetCurrentStage

func (d *DkgDiscussion) GetCurrentStage() Stage

type DkgGeneratedListener

type DkgGeneratedListener interface {
	GetDkgGeneratedEventChannel() chan bool
}

type DkgMessage

type DkgMessage interface {
	Signable
	GetType() DkgMessageType
	ProvideHeight() uint64
	String() string
}

type DkgMessageEvent

type DkgMessageEvent struct {
	Message DkgMessage
	Peer    DkgPeer
}

type DkgMessageType

type DkgMessageType uint16
const (
	DkgMessageTypeDeal DkgMessageType = iota + 200
	DkgMessageTypeDealResponse
	DkgMessageTypeSigSets
	DkgMessageTypeGenesisPublicKey
)

func (*DkgMessageType) DecodeMsg

func (z *DkgMessageType) DecodeMsg(dc *msgp.Reader) (err error)

DecodeMsg implements msgp.Decodable

func (DkgMessageType) EncodeMsg

func (z DkgMessageType) EncodeMsg(en *msgp.Writer) (err error)

EncodeMsg implements msgp.Encodable

func (DkgMessageType) MarshalMsg

func (z DkgMessageType) MarshalMsg(b []byte) (o []byte, err error)

MarshalMsg implements msgp.Marshaler

func (DkgMessageType) Msgsize

func (z DkgMessageType) Msgsize() (s int)

Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message

func (DkgMessageType) String

func (m DkgMessageType) String() string

func (*DkgMessageType) UnmarshalMsg

func (z *DkgMessageType) UnmarshalMsg(bts []byte) (o []byte, err error)

UnmarshalMsg implements msgp.Unmarshaler

type DkgPartner

type DkgPartner interface {
	Start()
	Stop()
	GetDkgPeerCommunicatorIncoming() DkgPeerCommunicatorIncoming
	RegisterDkgGeneratedListener(l DkgGeneratedListener)
}

type DkgPeer

type DkgPeer struct {
	Id             int
	PublicKey      crypto.PublicKey `json:"-"`
	Address        common.Address   `json:"address"`
	PublicKeyBytes hexutil.Bytes    `json:"public_key"`
}

type DkgPeerCommunicatorIncoming

type DkgPeerCommunicatorIncoming interface {
	GetPipeIn() chan *DkgMessageEvent
	GetPipeOut() chan *DkgMessageEvent
}

type DkgPeerCommunicatorOutgoing

type DkgPeerCommunicatorOutgoing interface {
	Broadcast(msg DkgMessage, peers []DkgPeer)
	Unicast(msg DkgMessage, peer DkgPeer)
}

type MessageDkgDeal

type MessageDkgDeal struct {
	DkgBasicInfo
	//Id   uint32
	Data []byte
}

func (*MessageDkgDeal) DecodeMsg

func (z *MessageDkgDeal) DecodeMsg(dc *msgp.Reader) (err error)

DecodeMsg implements msgp.Decodable

func (*MessageDkgDeal) EncodeMsg

func (z *MessageDkgDeal) EncodeMsg(en *msgp.Writer) (err error)

EncodeMsg implements msgp.Encodable

func (*MessageDkgDeal) GetDeal

func (m *MessageDkgDeal) GetDeal() (*dkg.Deal, error)

func (*MessageDkgDeal) GetType

func (z *MessageDkgDeal) GetType() DkgMessageType

func (*MessageDkgDeal) MarshalMsg

func (z *MessageDkgDeal) MarshalMsg(b []byte) (o []byte, err error)

MarshalMsg implements msgp.Marshaler

func (*MessageDkgDeal) Msgsize

func (z *MessageDkgDeal) Msgsize() (s int)

Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message

func (*MessageDkgDeal) SignatureTargets

func (m *MessageDkgDeal) SignatureTargets() []byte

func (MessageDkgDeal) String

func (m MessageDkgDeal) String() string

func (*MessageDkgDeal) UnmarshalMsg

func (z *MessageDkgDeal) UnmarshalMsg(bts []byte) (o []byte, err error)

UnmarshalMsg implements msgp.Unmarshaler

type MessageDkgDealResponse

type MessageDkgDealResponse struct {
	DkgBasicInfo
	//MyIndex   uint32
	Data []byte
}

func (*MessageDkgDealResponse) DecodeMsg

func (z *MessageDkgDealResponse) DecodeMsg(dc *msgp.Reader) (err error)

DecodeMsg implements msgp.Decodable

func (*MessageDkgDealResponse) EncodeMsg

func (z *MessageDkgDealResponse) EncodeMsg(en *msgp.Writer) (err error)

EncodeMsg implements msgp.Encodable

func (*MessageDkgDealResponse) GetResponse

func (m *MessageDkgDealResponse) GetResponse() (response *dkg.Response, err error)

func (MessageDkgDealResponse) GetType

func (*MessageDkgDealResponse) MarshalMsg

func (z *MessageDkgDealResponse) MarshalMsg(b []byte) (o []byte, err error)

MarshalMsg implements msgp.Marshaler

func (*MessageDkgDealResponse) Msgsize

func (z *MessageDkgDealResponse) Msgsize() (s int)

Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message

func (*MessageDkgDealResponse) SignatureTargets

func (m *MessageDkgDealResponse) SignatureTargets() []byte

func (MessageDkgDealResponse) String

func (m MessageDkgDealResponse) String() string

func (*MessageDkgDealResponse) UnmarshalMsg

func (z *MessageDkgDealResponse) UnmarshalMsg(bts []byte) (o []byte, err error)

UnmarshalMsg implements msgp.Unmarshaler

type MessageDkgGenesisPublicKey

type MessageDkgGenesisPublicKey struct {
	DkgBasicInfo
	PublicKeyBytes []byte
}

func (*MessageDkgGenesisPublicKey) DecodeMsg

func (z *MessageDkgGenesisPublicKey) DecodeMsg(dc *msgp.Reader) (err error)

DecodeMsg implements msgp.Decodable

func (*MessageDkgGenesisPublicKey) EncodeMsg

func (z *MessageDkgGenesisPublicKey) EncodeMsg(en *msgp.Writer) (err error)

EncodeMsg implements msgp.Encodable

func (*MessageDkgGenesisPublicKey) GetType

func (*MessageDkgGenesisPublicKey) MarshalMsg

func (z *MessageDkgGenesisPublicKey) MarshalMsg(b []byte) (o []byte, err error)

MarshalMsg implements msgp.Marshaler

func (*MessageDkgGenesisPublicKey) Msgsize

func (z *MessageDkgGenesisPublicKey) Msgsize() (s int)

Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message

func (*MessageDkgGenesisPublicKey) SignatureTargets

func (z *MessageDkgGenesisPublicKey) SignatureTargets() []byte

func (*MessageDkgGenesisPublicKey) String

func (z *MessageDkgGenesisPublicKey) String() string

func (*MessageDkgGenesisPublicKey) UnmarshalMsg

func (z *MessageDkgGenesisPublicKey) UnmarshalMsg(bts []byte) (o []byte, err error)

UnmarshalMsg implements msgp.Unmarshaler

type MessageDkgSigSets

type MessageDkgSigSets struct {
	DkgBasicInfo
	PkBls []byte
}

func (*MessageDkgSigSets) DecodeMsg

func (z *MessageDkgSigSets) DecodeMsg(dc *msgp.Reader) (err error)

DecodeMsg implements msgp.Decodable

func (*MessageDkgSigSets) EncodeMsg

func (z *MessageDkgSigSets) EncodeMsg(en *msgp.Writer) (err error)

EncodeMsg implements msgp.Encodable

func (*MessageDkgSigSets) GetType

func (z *MessageDkgSigSets) GetType() DkgMessageType

func (*MessageDkgSigSets) MarshalMsg

func (z *MessageDkgSigSets) MarshalMsg(b []byte) (o []byte, err error)

MarshalMsg implements msgp.Marshaler

func (*MessageDkgSigSets) Msgsize

func (z *MessageDkgSigSets) Msgsize() (s int)

Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message

func (*MessageDkgSigSets) SignatureTargets

func (m *MessageDkgSigSets) SignatureTargets() []byte

func (*MessageDkgSigSets) String

func (z *MessageDkgSigSets) String() string

func (*MessageDkgSigSets) UnmarshalMsg

func (z *MessageDkgSigSets) UnmarshalMsg(bts []byte) (o []byte, err error)

UnmarshalMsg implements msgp.Unmarshaler

type PartPub

type PartPub struct {
	Point kyber.Point
	Peer  DkgPeer
}

type PartPubs

type PartPubs []PartPub

func (PartPubs) Len

func (h PartPubs) Len() int

func (PartPubs) Peers

func (p PartPubs) Peers() []DkgPeer

func (PartPubs) Points

func (p PartPubs) Points() []kyber.Point

type PartSec

type PartSec struct {
	PartPub
	Scalar     kyber.Scalar
	PrivateKey crypto.PrivateKey
}

func GeneratePeers

func GeneratePeers(suite *bn256.Suite, n int) []PartSec

func SetupAllDkgers

func SetupAllDkgers(suite *bn256.Suite, numParts int, threshold int) (dkgers []*dkg.DistKeyGenerator, partSecs []PartSec, err error)

SetupAllDkgers generate all Dkgers locally (for genesis or test purporse).

type Signable

type Signable interface {
	SignatureTargets() []byte
}

type Stagable

type Stagable interface {
	GetCurrentStage() Stage
}

Stagable will justify which stage it is currently on, depending on the messages it received e.g., if the messages received are 1,2,6,7,8, then the current stage is 2

type Stage

type Stage int
const (
	StageStart Stage = iota
	StageDealReceived
)

Directories

Path Synopsis
// Copyright © 2019 Annchain Authors <EMAIL ADDRESS> // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License.
// Copyright © 2019 Annchain Authors <EMAIL ADDRESS> // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL