From 73d1ca6258f52ffcad0200d5dbd01d9e1d733562 Mon Sep 17 00:00:00 2001 From: Jonas Theis <mail@jonastheis.de> Date: Sat, 28 Mar 2020 01:36:17 +0100 Subject: [PATCH] Integrate uniform node identity (#304) * Move marshalutil to hive.go * Refactor existing code (before binary) to use new hive.go/identity #282 * Adjust binary code to use hive.go/identity and remove signature/ed25519 #282 * Adjust moved files from merge to use hive.go/marshalutil * Adjust moved files from merge to use hive.go/identity and hive.go/crypto * Adjust for changes in hive.go * Fix: fixed a bug due to refactor Co-authored-by: Hans Moog <hm@mkjc.net> --- .../binary/messagelayer/message/message.go | 33 +++++------- .../binary/messagelayer/tangle/tangle_test.go | 12 +++-- .../messagelayer/test/transaction_test.go | 11 ++-- .../tipselector/tipselector_test.go | 11 ++-- .../transactionparser_test.go | 11 ++-- packages/binary/signature/ed25119/ed25119.go | 18 ------- packages/binary/signature/ed25119/key_pair.go | 6 --- .../binary/signature/ed25119/private_key.go | 31 ----------- .../binary/signature/ed25119/public_key.go | 53 ------------------- .../binary/signature/ed25119/signature.go | 48 ----------------- packages/binary/spammer/spammer.go | 34 +++++++++--- .../binary/valuetransfer/address/address.go | 5 +- .../address/signaturescheme/ed25519.go | 20 +++---- .../valuetransfer/payload/payload_test.go | 12 +++-- .../valuetransfer/tangle/tangle_test.go | 6 +-- .../transaction/signatures_test.go | 6 +-- packages/gossip/manager.go | 30 ++++++----- packages/gossip/neighbor_test.go | 11 ++-- packages/gossip/server/server.go | 34 ++++++------ packages/gossip/server/server_test.go | 4 +- plugins/autopeering/autopeering.go | 17 ++++-- plugins/spa/explorer_routes.go | 4 +- plugins/webapi/getNeighbors/plugin.go | 6 +-- 23 files changed, 156 insertions(+), 267 deletions(-) delete mode 100644 packages/binary/signature/ed25119/ed25119.go delete mode 100644 packages/binary/signature/ed25119/key_pair.go delete mode 100644 packages/binary/signature/ed25119/private_key.go delete mode 100644 packages/binary/signature/ed25119/public_key.go delete mode 100644 packages/binary/signature/ed25119/signature.go diff --git a/packages/binary/messagelayer/message/message.go b/packages/binary/messagelayer/message/message.go index 7bd44f50..26064030 100644 --- a/packages/binary/messagelayer/message/message.go +++ b/packages/binary/messagelayer/message/message.go @@ -4,16 +4,15 @@ import ( "sync" "time" + "github.com/iotaledger/hive.go/crypto/ed25519" + "github.com/iotaledger/hive.go/identity" "github.com/iotaledger/hive.go/marshalutil" "github.com/iotaledger/hive.go/objectstorage" "github.com/iotaledger/hive.go/stringify" - - "github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload" - "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" - "github.com/mr-tron/base58" - "golang.org/x/crypto/blake2b" + + "github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload" ) // region Message ////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -25,13 +24,13 @@ type Message struct { // core properties (they are part of the transaction when being sent) trunkTransactionId Id branchTransactionId Id - issuerPublicKey ed25119.PublicKey + issuerPublicKey ed25519.PublicKey issuingTime time.Time sequenceNumber uint64 payload payload.Payload bytes []byte bytesMutex sync.RWMutex - signature ed25119.Signature + signature ed25519.Signature signatureMutex sync.RWMutex // derived properties @@ -41,20 +40,20 @@ type Message struct { payloadIdMutex sync.RWMutex // only stored on the machine of the signer - issuerPrivateKey ed25119.PrivateKey + issuerLocalIdentity *identity.LocalIdentity } // New creates a new transaction with the details provided by the issuer. -func New(trunkTransactionId Id, branchTransactionId Id, issuerKeyPair ed25119.KeyPair, issuingTime time.Time, sequenceNumber uint64, payload payload.Payload) (result *Message) { +func New(trunkTransactionId Id, branchTransactionId Id, issuerPublicKey ed25519.PublicKey, issuingTime time.Time, sequenceNumber uint64, payload payload.Payload, localIdentity *identity.LocalIdentity) (result *Message) { return &Message{ trunkTransactionId: trunkTransactionId, branchTransactionId: branchTransactionId, - issuerPublicKey: issuerKeyPair.PublicKey, + issuerPublicKey: issuerPublicKey, issuingTime: issuingTime, sequenceNumber: sequenceNumber, payload: payload, - issuerPrivateKey: issuerKeyPair.PrivateKey, + issuerLocalIdentity: localIdentity, } } @@ -124,7 +123,7 @@ func (transaction *Message) VerifySignature() (result bool) { transactionBytes := transaction.Bytes() transaction.signatureMutex.RLock() - result = transaction.issuerPublicKey.VerifySignature(transactionBytes[:len(transactionBytes)-ed25119.SignatureSize], transaction.signature) + result = transaction.issuerPublicKey.VerifySignature(transactionBytes[:len(transactionBytes)-ed25519.SignatureSize], transaction.signature) transaction.signatureMutex.RUnlock() return @@ -246,7 +245,7 @@ func (transaction *Message) Bytes() []byte { marshalUtil.WriteTime(transaction.issuingTime) marshalUtil.WriteUint64(transaction.sequenceNumber) marshalUtil.WriteBytes(transaction.payload.Bytes()) - marshalUtil.WriteBytes(transaction.issuerPrivateKey.Sign(marshalUtil.Bytes()).Bytes()) + marshalUtil.WriteBytes(transaction.issuerLocalIdentity.Sign(marshalUtil.Bytes()).Bytes()) return marshalUtil.Bytes() } @@ -262,9 +261,7 @@ func (transaction *Message) UnmarshalObjectStorageValue(data []byte) (err error, if transaction.branchTransactionId, err = ParseId(marshalUtil); err != nil { return } - if transaction.issuerPublicKey, err = ed25119.ParsePublicKey(marshalUtil); err != nil { - return - } + // TODO PARSE PUBLIC KEY if transaction.issuingTime, err = marshalUtil.ReadTime(); err != nil { return } @@ -274,9 +271,7 @@ func (transaction *Message) UnmarshalObjectStorageValue(data []byte) (err error, if transaction.payload, err = payload.Parse(marshalUtil); err != nil { return } - if transaction.signature, err = ed25119.ParseSignature(marshalUtil); err != nil { - return - } + // TODO PARSE SIGNATURE // return the number of bytes we processed consumedBytes = marshalUtil.ReadOffset() diff --git a/packages/binary/messagelayer/tangle/tangle_test.go b/packages/binary/messagelayer/tangle/tangle_test.go index 40a263f6..b8ca0521 100644 --- a/packages/binary/messagelayer/tangle/tangle_test.go +++ b/packages/binary/messagelayer/tangle/tangle_test.go @@ -8,11 +8,11 @@ import ( "time" "github.com/iotaledger/hive.go/events" + "github.com/iotaledger/hive.go/identity" "github.com/stretchr/testify/require" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/message" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload" - "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" "github.com/iotaledger/goshimmer/packages/database" "github.com/iotaledger/goshimmer/plugins/config" ) @@ -31,11 +31,11 @@ func BenchmarkTangle_AttachTransaction(b *testing.B) { return } - testIdentity := ed25119.GenerateKeyPair() + testIdentity := identity.GenerateLocalIdentity() transactionBytes := make([]*message.Message, b.N) for i := 0; i < b.N; i++ { - transactionBytes[i] = message.New(message.EmptyId, message.EmptyId, testIdentity, time.Now(), 0, payload.NewData([]byte("some data"))) + transactionBytes[i] = message.New(message.EmptyId, message.EmptyId, testIdentity.PublicKey(), time.Now(), 0, payload.NewData([]byte("some data")), testIdentity) transactionBytes[i].Bytes() } @@ -90,8 +90,10 @@ func TestTangle_AttachTransaction(t *testing.T) { fmt.Println("REMOVED:", transactionId) })) - newTransaction1 := message.New(message.EmptyId, message.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, payload.NewData([]byte("some data"))) - newTransaction2 := message.New(newTransaction1.GetId(), newTransaction1.GetId(), ed25119.GenerateKeyPair(), time.Now(), 0, payload.NewData([]byte("some other data"))) + localIdentity1 := identity.GenerateLocalIdentity() + localIdentity2 := identity.GenerateLocalIdentity() + newTransaction1 := message.New(message.EmptyId, message.EmptyId, localIdentity1.PublicKey(), time.Now(), 0, payload.NewData([]byte("some data")), localIdentity1) + newTransaction2 := message.New(newTransaction1.GetId(), newTransaction1.GetId(), localIdentity2.PublicKey(), time.Now(), 0, payload.NewData([]byte("some other data")), localIdentity2) messageTangle.AttachMessage(newTransaction2) diff --git a/packages/binary/messagelayer/test/transaction_test.go b/packages/binary/messagelayer/test/transaction_test.go index 6881c27c..e5b913cd 100644 --- a/packages/binary/messagelayer/test/transaction_test.go +++ b/packages/binary/messagelayer/test/transaction_test.go @@ -7,21 +7,22 @@ import ( "time" "github.com/iotaledger/hive.go/async" - + "github.com/iotaledger/hive.go/identity" "github.com/panjf2000/ants/v2" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/message" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload" - "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" ) func BenchmarkVerifyDataTransactions(b *testing.B) { var pool async.WorkerPool pool.Tune(runtime.NumCPU() * 2) + localIdentity := identity.GenerateLocalIdentity() + transactions := make([][]byte, b.N) for i := 0; i < b.N; i++ { - tx := message.New(message.EmptyId, message.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, payload.NewData([]byte("some data"))) + tx := message.New(message.EmptyId, message.EmptyId, localIdentity.PublicKey(), time.Now(), 0, payload.NewData([]byte("some data")), localIdentity) transactions[i] = tx.Bytes() } @@ -45,9 +46,11 @@ func BenchmarkVerifyDataTransactions(b *testing.B) { func BenchmarkVerifySignature(b *testing.B) { pool, _ := ants.NewPool(80, ants.WithNonblocking(false)) + localIdentity := identity.GenerateLocalIdentity() + transactions := make([]*message.Message, b.N) for i := 0; i < b.N; i++ { - transactions[i] = message.New(message.EmptyId, message.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, payload.NewData([]byte("test"))) + transactions[i] = message.New(message.EmptyId, message.EmptyId, localIdentity.PublicKey(), time.Now(), 0, payload.NewData([]byte("test")), localIdentity) transactions[i].Bytes() } diff --git a/packages/binary/messagelayer/tipselector/tipselector_test.go b/packages/binary/messagelayer/tipselector/tipselector_test.go index 9adda6fc..929d515c 100644 --- a/packages/binary/messagelayer/tipselector/tipselector_test.go +++ b/packages/binary/messagelayer/tipselector/tipselector_test.go @@ -4,11 +4,11 @@ import ( "testing" "time" + "github.com/iotaledger/hive.go/identity" "github.com/stretchr/testify/assert" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/message" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload" - "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" ) func Test(t *testing.T) { @@ -21,7 +21,8 @@ func Test(t *testing.T) { assert.Equal(t, message.EmptyId, branch1) // create a transaction and attach it - transaction1 := message.New(trunk1, branch1, ed25119.GenerateKeyPair(), time.Now(), 0, payload.NewData([]byte("testtransaction"))) + localIdentity1 := identity.GenerateLocalIdentity() + transaction1 := message.New(trunk1, branch1, localIdentity1.PublicKey(), time.Now(), 0, payload.NewData([]byte("testtransaction")), localIdentity1) tipSelector.AddTip(transaction1) // check if the tip shows up in the tip count @@ -33,15 +34,17 @@ func Test(t *testing.T) { assert.Equal(t, transaction1.GetId(), branch2) // create a 2nd transaction and attach it - transaction2 := message.New(message.EmptyId, message.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, payload.NewData([]byte("testtransaction"))) + localIdentity2 := identity.GenerateLocalIdentity() + transaction2 := message.New(message.EmptyId, message.EmptyId, localIdentity2.PublicKey(), time.Now(), 0, payload.NewData([]byte("testtransaction")), localIdentity2) tipSelector.AddTip(transaction2) // check if the tip shows up in the tip count assert.Equal(t, 2, tipSelector.GetTipCount()) // attach a transaction to our two tips + localIdentity3 := identity.GenerateLocalIdentity() trunk3, branch3 := tipSelector.GetTips() - transaction3 := message.New(trunk3, branch3, ed25119.GenerateKeyPair(), time.Now(), 0, payload.NewData([]byte("testtransaction"))) + transaction3 := message.New(trunk3, branch3, localIdentity3.PublicKey(), time.Now(), 0, payload.NewData([]byte("testtransaction")), localIdentity3) tipSelector.AddTip(transaction3) // check if the tip shows replaces the current tips diff --git a/packages/binary/messagelayer/transactionparser/transactionparser_test.go b/packages/binary/messagelayer/transactionparser/transactionparser_test.go index eb0c4af4..b1493d5c 100644 --- a/packages/binary/messagelayer/transactionparser/transactionparser_test.go +++ b/packages/binary/messagelayer/transactionparser/transactionparser_test.go @@ -7,14 +7,15 @@ import ( "time" "github.com/iotaledger/hive.go/events" + "github.com/iotaledger/hive.go/identity" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/message" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload" - "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" ) func BenchmarkTransactionParser_ParseBytesSame(b *testing.B) { - txBytes := message.New(message.EmptyId, message.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, payload.NewData([]byte("Test"))).Bytes() + localIdentity := identity.GenerateLocalIdentity() + txBytes := message.New(message.EmptyId, message.EmptyId, localIdentity.PublicKey(), time.Now(), 0, payload.NewData([]byte("Test")), localIdentity).Bytes() txParser := New() b.ResetTimer() @@ -28,8 +29,9 @@ func BenchmarkTransactionParser_ParseBytesSame(b *testing.B) { func BenchmarkTransactionParser_ParseBytesDifferent(b *testing.B) { transactionBytes := make([][]byte, b.N) + localIdentity := identity.GenerateLocalIdentity() for i := 0; i < b.N; i++ { - transactionBytes[i] = message.New(message.EmptyId, message.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, payload.NewData([]byte("Test"+strconv.Itoa(i)))).Bytes() + transactionBytes[i] = message.New(message.EmptyId, message.EmptyId, localIdentity.PublicKey(), time.Now(), 0, payload.NewData([]byte("Test"+strconv.Itoa(i))), localIdentity).Bytes() } txParser := New() @@ -44,7 +46,8 @@ func BenchmarkTransactionParser_ParseBytesDifferent(b *testing.B) { } func TestTransactionParser_ParseTransaction(t *testing.T) { - tx := message.New(message.EmptyId, message.EmptyId, ed25119.GenerateKeyPair(), time.Now(), 0, payload.NewData([]byte("Test"))) + localIdentity := identity.GenerateLocalIdentity() + tx := message.New(message.EmptyId, message.EmptyId, localIdentity.PublicKey(), time.Now(), 0, payload.NewData([]byte("Test")), localIdentity) txParser := New() txParser.Parse(tx.Bytes(), nil) diff --git a/packages/binary/signature/ed25119/ed25119.go b/packages/binary/signature/ed25119/ed25119.go deleted file mode 100644 index d4b65997..00000000 --- a/packages/binary/signature/ed25119/ed25119.go +++ /dev/null @@ -1,18 +0,0 @@ -package ed25119 - -import ( - "crypto/rand" - - "github.com/oasislabs/ed25519" -) - -func GenerateKeyPair() (keyPair KeyPair) { - if public, private, err := ed25519.GenerateKey(rand.Reader); err != nil { - panic(err) - } else { - copy(keyPair.PrivateKey[:], private) - copy(keyPair.PublicKey[:], public) - - return - } -} diff --git a/packages/binary/signature/ed25119/key_pair.go b/packages/binary/signature/ed25119/key_pair.go deleted file mode 100644 index ad0c31bb..00000000 --- a/packages/binary/signature/ed25119/key_pair.go +++ /dev/null @@ -1,6 +0,0 @@ -package ed25119 - -type KeyPair struct { - PrivateKey PrivateKey - PublicKey PublicKey -} diff --git a/packages/binary/signature/ed25119/private_key.go b/packages/binary/signature/ed25119/private_key.go deleted file mode 100644 index 9885a643..00000000 --- a/packages/binary/signature/ed25119/private_key.go +++ /dev/null @@ -1,31 +0,0 @@ -package ed25119 - -import ( - "fmt" - - "github.com/oasislabs/ed25519" -) - -type PrivateKey [PrivateKeySize]byte - -func PrivateKeyFromBytes(bytes []byte) (result PrivateKey, err error, consumedBytes int) { - if len(bytes) < PrivateKeySize { - err = fmt.Errorf("bytes too short") - - return - } - - copy(result[:], bytes) - - consumedBytes = PrivateKeySize - - return -} - -func (privateKey PrivateKey) Sign(data []byte) (result Signature) { - copy(result[:], ed25519.Sign(privateKey[:], data)) - - return -} - -const PrivateKeySize = 64 diff --git a/packages/binary/signature/ed25119/public_key.go b/packages/binary/signature/ed25119/public_key.go deleted file mode 100644 index 485ac0fe..00000000 --- a/packages/binary/signature/ed25119/public_key.go +++ /dev/null @@ -1,53 +0,0 @@ -package ed25119 - -import ( - "errors" - "fmt" - - "github.com/iotaledger/hive.go/marshalutil" - "github.com/oasislabs/ed25519" -) - -type PublicKey [PublicKeySize]byte - -func PublicKeyFromBytes(bytes []byte) (result PublicKey, err error, consumedBytes int) { - if len(bytes) < PublicKeySize { - err = fmt.Errorf("bytes too short") - - return - } - - copy(result[:], bytes) - - consumedBytes = PublicKeySize - - return -} - -func ParsePublicKey(marshalUtil *marshalutil.MarshalUtil) (PublicKey, error) { - if id, err := marshalUtil.Parse(func(data []byte) (interface{}, error, int) { return PublicKeyFromBytes(data) }); err != nil { - return PublicKey{}, err - } else { - return id.(PublicKey), nil - } -} - -func (publicKey PublicKey) VerifySignature(data []byte, signature Signature) bool { - return ed25519.Verify(publicKey[:], data, signature[:]) -} - -func (publicKey PublicKey) Bytes() []byte { - return publicKey[:] -} - -func (publicKey *PublicKey) UnmarshalBinary(bytes []byte) (err error) { - if len(bytes) < PublicKeySize { - return errors.New("not enough bytes") - } - - copy(publicKey[:], bytes[:]) - - return -} - -const PublicKeySize = 32 diff --git a/packages/binary/signature/ed25119/signature.go b/packages/binary/signature/ed25119/signature.go deleted file mode 100644 index 6362dce5..00000000 --- a/packages/binary/signature/ed25119/signature.go +++ /dev/null @@ -1,48 +0,0 @@ -package ed25119 - -import ( - "errors" - "fmt" - - "github.com/iotaledger/hive.go/marshalutil" -) - -type Signature [SignatureSize]byte - -func SignatureFromBytes(bytes []byte) (result Signature, err error, consumedBytes int) { - if len(bytes) < SignatureSize { - err = fmt.Errorf("bytes too short") - - return - } - - copy(result[:SignatureSize], bytes) - - consumedBytes = SignatureSize - - return -} - -func ParseSignature(marshalUtil *marshalutil.MarshalUtil) (Signature, error) { - if id, err := marshalUtil.Parse(func(data []byte) (interface{}, error, int) { return SignatureFromBytes(data) }); err != nil { - return Signature{}, err - } else { - return id.(Signature), nil - } -} - -func (signature Signature) Bytes() []byte { - return signature[:] -} - -func (signature *Signature) UnmarshalBinary(bytes []byte) (err error) { - if len(bytes) < SignatureSize { - return errors.New("not enough bytes") - } - - copy(signature[:], bytes[:]) - - return -} - -const SignatureSize = 64 diff --git a/packages/binary/spammer/spammer.go b/packages/binary/spammer/spammer.go index d8adc712..525ae075 100644 --- a/packages/binary/spammer/spammer.go +++ b/packages/binary/spammer/spammer.go @@ -4,13 +4,13 @@ import ( "sync/atomic" "time" + "github.com/iotaledger/hive.go/identity" "github.com/iotaledger/hive.go/types" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/message" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/tipselector" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/transactionparser" - "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" ) type Spammer struct { @@ -42,7 +42,8 @@ func (spammer *Spammer) Shutdown() { } func (spammer *Spammer) run(tps int, processId int64) { - spammingIdentity := ed25119.GenerateKeyPair() + // TODO: this should be the local peer's identity + spammingIdentity := identity.GenerateLocalIdentity() currentSentCounter := 0 start := time.Now() @@ -51,11 +52,19 @@ func (spammer *Spammer) run(tps int, processId int64) { return } + // TODO: use transaction factory trunkTransactionId, branchTransactionId := spammer.tipSelector.GetTips() - spammer.transactionParser.Parse( - message.New(trunkTransactionId, branchTransactionId, spammingIdentity, time.Now(), 0, payload.NewData([]byte("SPAM"))).Bytes(), - nil, + + msg := message.New( + trunkTransactionId, + branchTransactionId, + spammingIdentity.PublicKey(), + time.Now(), + 0, + payload.NewData([]byte("SPAM")), + spammingIdentity, ) + spammer.transactionParser.Parse(msg.Bytes(), nil) currentSentCounter++ @@ -73,7 +82,8 @@ func (spammer *Spammer) run(tps int, processId int64) { } func (spammer *Spammer) sendBurst(transactions int, processId int64) { - spammingIdentity := ed25119.GenerateKeyPair() + // TODO: this should be the local peer's identity + spammingIdentity := identity.GenerateLocalIdentity() previousTransactionId := message.EmptyId @@ -83,7 +93,17 @@ func (spammer *Spammer) sendBurst(transactions int, processId int64) { return } - spamTransaction := message.New(previousTransactionId, previousTransactionId, spammingIdentity, time.Now(), 0, payload.NewData([]byte("SPAM"))) + // TODO: use transaction factory + spamTransaction := message.New( + previousTransactionId, + previousTransactionId, + spammingIdentity.PublicKey(), + time.Now(), + 0, + payload.NewData([]byte("SPAM")), + spammingIdentity, + ) + previousTransactionId = spamTransaction.GetId() burstBuffer[i] = spamTransaction.Bytes() } diff --git a/packages/binary/valuetransfer/address/address.go b/packages/binary/valuetransfer/address/address.go index 57a024af..26bfa6f2 100644 --- a/packages/binary/valuetransfer/address/address.go +++ b/packages/binary/valuetransfer/address/address.go @@ -3,10 +3,11 @@ package address import ( "crypto/rand" "fmt" + + "github.com/iotaledger/hive.go/crypto/ed25519" "github.com/mr-tron/base58" "golang.org/x/crypto/blake2b" - "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" "github.com/iotaledger/hive.go/marshalutil" ) @@ -55,7 +56,7 @@ func FromBase58(base58String string) (address Address, err error) { } // FromED25519PubKey creates an address from an ed25519 public key. -func FromED25519PubKey(key ed25119.PublicKey) (address Address) { +func FromED25519PubKey(key ed25519.PublicKey) (address Address) { digest := blake2b.Sum256(key[:]) address[0] = VERSION_ED25519 diff --git a/packages/binary/valuetransfer/address/signaturescheme/ed25519.go b/packages/binary/valuetransfer/address/signaturescheme/ed25519.go index 7da880a3..54349efe 100644 --- a/packages/binary/valuetransfer/address/signaturescheme/ed25519.go +++ b/packages/binary/valuetransfer/address/signaturescheme/ed25519.go @@ -3,16 +3,16 @@ package signaturescheme import ( "fmt" + "github.com/iotaledger/hive.go/crypto/ed25519" "github.com/iotaledger/hive.go/marshalutil" - "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" "github.com/iotaledger/goshimmer/packages/binary/valuetransfer/address" ) // region PUBLIC API /////////////////////////////////////////////////////////////////////////////////////////////////// // ED25519 creates an instance of a signature scheme, that is used to sign the corresponding address. -func ED25519(keyPair ed25119.KeyPair) SignatureScheme { +func ED25519(keyPair ed25519.KeyPair) SignatureScheme { return &ed25519SignatureScheme{ keyPair: keyPair, } @@ -24,7 +24,7 @@ func ED25519(keyPair ed25119.KeyPair) SignatureScheme { // ed25519SignatureScheme defines an interface for ED25519 elliptic curve signatures. type ed25519SignatureScheme struct { - keyPair ed25119.KeyPair + keyPair ed25519.KeyPair } // Version returns the version byte that is associated to this signature scheme. @@ -54,8 +54,8 @@ var _ SignatureScheme = &ed25519SignatureScheme{} // ed25519Signature represents a signature for an addresses that uses elliptic curve cryptography. type ed25519Signature struct { - publicKey ed25119.PublicKey - signature ed25119.Signature + publicKey ed25519.PublicKey + signature ed25519.Signature } // ed25519SignatureFromBytes unmarshals an ed25519 signatures from a sequence of bytes. @@ -85,18 +85,18 @@ func Ed25519SignatureFromBytes(bytes []byte, optionalTargetObject ...*ed25519Sig } // read public key - publicKey, err := marshalUtil.Parse(func(data []byte) (interface{}, error, int) { return ed25119.PublicKeyFromBytes(data) }) + publicKey, err := marshalUtil.Parse(func(data []byte) (interface{}, error, int) { return ed25519.PublicKeyFromBytes(data) }) if err != nil { return } - result.publicKey = publicKey.(ed25119.PublicKey) + result.publicKey = publicKey.(ed25519.PublicKey) // read signature - signature, err := marshalUtil.Parse(func(data []byte) (interface{}, error, int) { return ed25119.SignatureFromBytes(data) }) + signature, err := marshalUtil.Parse(func(data []byte) (interface{}, error, int) { return ed25519.SignatureFromBytes(data) }) if err != nil { return } - result.signature = signature.(ed25119.Signature) + result.signature = signature.(ed25519.Signature) // return the number of bytes we processed consumedBytes = marshalUtil.ReadOffset() @@ -111,7 +111,7 @@ func (signature *ed25519Signature) IsValid(signedData []byte) bool { // Bytes returns a marshaled version of the signature. func (signature *ed25519Signature) Bytes() []byte { - marshalUtil := marshalutil.New(1 + ed25119.PublicKeySize + ed25119.SignatureSize) + marshalUtil := marshalutil.New(1 + ed25519.PublicKeySize + ed25519.SignatureSize) marshalUtil.WriteByte(address.VERSION_ED25519) marshalUtil.WriteBytes(signature.publicKey[:]) marshalUtil.WriteBytes(signature.signature[:]) diff --git a/packages/binary/valuetransfer/payload/payload_test.go b/packages/binary/valuetransfer/payload/payload_test.go index fc7b762a..46d445cf 100644 --- a/packages/binary/valuetransfer/payload/payload_test.go +++ b/packages/binary/valuetransfer/payload/payload_test.go @@ -5,10 +5,11 @@ import ( "testing" "time" + "github.com/iotaledger/hive.go/crypto/ed25519" + "github.com/iotaledger/hive.go/identity" "github.com/stretchr/testify/assert" "github.com/iotaledger/goshimmer/packages/binary/messagelayer/message" - "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" "github.com/iotaledger/goshimmer/packages/binary/valuetransfer/address" "github.com/iotaledger/goshimmer/packages/binary/valuetransfer/address/signaturescheme" "github.com/iotaledger/goshimmer/packages/binary/valuetransfer/balance" @@ -45,6 +46,7 @@ func ExamplePayload() { ) // 3. build actual transaction (the base layer creates this and wraps the ontology provided payload) + localIdentity := identity.GenerateLocalIdentity() tx := message.New( // trunk in "network tangle" ontology (filled by tipSelector) message.EmptyId, @@ -53,7 +55,7 @@ func ExamplePayload() { message.EmptyId, // issuer of the transaction (signs automatically) - ed25119.GenerateKeyPair(), + localIdentity.PublicKey(), // the time when the transaction was created time.Now(), @@ -63,14 +65,16 @@ func ExamplePayload() { // payload valuePayload, + + localIdentity, ) fmt.Println(tx) } func TestPayload(t *testing.T) { - addressKeyPair1 := ed25119.GenerateKeyPair() - addressKeyPair2 := ed25119.GenerateKeyPair() + addressKeyPair1 := ed25519.GenerateKeyPair() + addressKeyPair2 := ed25519.GenerateKeyPair() originalPayload := New( GenesisId, diff --git a/packages/binary/valuetransfer/tangle/tangle_test.go b/packages/binary/valuetransfer/tangle/tangle_test.go index 93e35e7d..f2f371ec 100644 --- a/packages/binary/valuetransfer/tangle/tangle_test.go +++ b/packages/binary/valuetransfer/tangle/tangle_test.go @@ -6,11 +6,11 @@ import ( "os" "testing" + "github.com/iotaledger/hive.go/crypto/ed25519" "github.com/iotaledger/hive.go/events" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" "github.com/iotaledger/goshimmer/packages/binary/valuetransfer/address" "github.com/iotaledger/goshimmer/packages/binary/valuetransfer/balance" "github.com/iotaledger/goshimmer/packages/binary/valuetransfer/payload" @@ -59,8 +59,8 @@ func TestTangle_AttachPayload(t *testing.T) { metadata.Release() })) - addressKeyPair1 := ed25119.GenerateKeyPair() - addressKeyPair2 := ed25119.GenerateKeyPair() + addressKeyPair1 := ed25519.GenerateKeyPair() + addressKeyPair2 := ed25519.GenerateKeyPair() transferId1, _ := transaction.IdFromBase58("8opHzTAnfzRpPEx21XtnrVTX28YQuCpAjcn1PczScKh") transferId2, _ := transaction.IdFromBase58("4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM") diff --git a/packages/binary/valuetransfer/transaction/signatures_test.go b/packages/binary/valuetransfer/transaction/signatures_test.go index a27426c1..a344780c 100644 --- a/packages/binary/valuetransfer/transaction/signatures_test.go +++ b/packages/binary/valuetransfer/transaction/signatures_test.go @@ -3,9 +3,9 @@ package transaction import ( "testing" + "github.com/iotaledger/hive.go/crypto/ed25519" "github.com/stretchr/testify/assert" - "github.com/iotaledger/goshimmer/packages/binary/signature/ed25119" "github.com/iotaledger/goshimmer/packages/binary/valuetransfer/address" "github.com/iotaledger/goshimmer/packages/binary/valuetransfer/address/signaturescheme" ) @@ -13,8 +13,8 @@ import ( func TestSignatures(t *testing.T) { dataToSign := []byte("test") - address1SigScheme := signaturescheme.ED25519(ed25119.GenerateKeyPair()) - address2SigScheme := signaturescheme.ED25519(ed25119.GenerateKeyPair()) + address1SigScheme := signaturescheme.ED25519(ed25519.GenerateKeyPair()) + address2SigScheme := signaturescheme.ED25519(ed25519.GenerateKeyPair()) address3SigScheme := signaturescheme.RandBLS() signatures := NewSignatures() diff --git a/packages/gossip/manager.go b/packages/gossip/manager.go index b8b676a9..00846158 100644 --- a/packages/gossip/manager.go +++ b/packages/gossip/manager.go @@ -6,14 +6,16 @@ import ( "net" "sync" - "github.com/iotaledger/goshimmer/packages/binary/messagelayer/message" - "github.com/golang/protobuf/proto" - pb "github.com/iotaledger/goshimmer/packages/gossip/proto" - "github.com/iotaledger/goshimmer/packages/gossip/server" + "go.uber.org/zap" + "github.com/iotaledger/hive.go/autopeering/peer" "github.com/iotaledger/hive.go/events" - "go.uber.org/zap" + "github.com/iotaledger/hive.go/identity" + + "github.com/iotaledger/goshimmer/packages/binary/messagelayer/message" + pb "github.com/iotaledger/goshimmer/packages/gossip/proto" + "github.com/iotaledger/goshimmer/packages/gossip/server" ) const ( @@ -37,7 +39,7 @@ type Manager struct { mu sync.RWMutex srv *server.TCP - neighbors map[peer.ID]*Neighbor + neighbors map[identity.ID]*Neighbor running bool } @@ -47,7 +49,7 @@ func NewManager(local *peer.Local, f GetTransaction, log *zap.SugaredLogger) *Ma getTransaction: f, log: log, srv: nil, - neighbors: make(map[peer.ID]*Neighbor), + neighbors: make(map[identity.ID]*Neighbor), running: false, } } @@ -113,7 +115,7 @@ func (m *Manager) AddInbound(p *peer.Peer) error { } // NeighborRemoved disconnects the neighbor with the given ID. -func (m *Manager) DropNeighbor(id peer.ID) error { +func (m *Manager) DropNeighbor(id identity.ID) error { n, err := m.removeNeighbor(id) if err != nil { return err @@ -125,7 +127,7 @@ func (m *Manager) DropNeighbor(id peer.ID) error { // RequestTransaction requests the transaction with the given hash from the neighbors. // If no peer is provided, all neighbors are queried. -func (m *Manager) RequestTransaction(txHash []byte, to ...peer.ID) { +func (m *Manager) RequestTransaction(txHash []byte, to ...identity.ID) { req := &pb.TransactionRequest{ Hash: txHash, } @@ -135,7 +137,7 @@ func (m *Manager) RequestTransaction(txHash []byte, to ...peer.ID) { // SendTransaction adds the given transaction data to the send queue of the neighbors. // The actual send then happens asynchronously. If no peer is provided, it is send to all neighbors. -func (m *Manager) SendTransaction(txData []byte, to ...peer.ID) { +func (m *Manager) SendTransaction(txData []byte, to ...identity.ID) { tx := &pb.Transaction{ Data: txData, } @@ -153,14 +155,14 @@ func (m *Manager) GetAllNeighbors() []*Neighbor { return result } -func (m *Manager) getNeighbors(ids ...peer.ID) []*Neighbor { +func (m *Manager) getNeighbors(ids ...identity.ID) []*Neighbor { if len(ids) > 0 { return m.getNeighborsById(ids) } return m.GetAllNeighbors() } -func (m *Manager) getNeighborsById(ids []peer.ID) []*Neighbor { +func (m *Manager) getNeighborsById(ids []identity.ID) []*Neighbor { result := make([]*Neighbor, 0, len(ids)) m.mu.RLock() @@ -173,7 +175,7 @@ func (m *Manager) getNeighborsById(ids []peer.ID) []*Neighbor { return result } -func (m *Manager) send(b []byte, to ...peer.ID) { +func (m *Manager) send(b []byte, to ...identity.ID) { neighbors := m.getNeighbors(to...) for _, nbr := range neighbors { @@ -219,7 +221,7 @@ func (m *Manager) addNeighbor(peer *peer.Peer, connectorFunc func(*peer.Peer) (n return nil } -func (m *Manager) removeNeighbor(id peer.ID) (*Neighbor, error) { +func (m *Manager) removeNeighbor(id identity.ID) (*Neighbor, error) { m.mu.Lock() defer m.mu.Unlock() if _, ok := m.neighbors[id]; !ok { diff --git a/packages/gossip/neighbor_test.go b/packages/gossip/neighbor_test.go index 2ec1a2be..bde828f5 100644 --- a/packages/gossip/neighbor_test.go +++ b/packages/gossip/neighbor_test.go @@ -1,7 +1,6 @@ package gossip import ( - "crypto/ed25519" "net" "sync" "sync/atomic" @@ -10,7 +9,9 @@ import ( "github.com/iotaledger/hive.go/autopeering/peer" "github.com/iotaledger/hive.go/autopeering/peer/service" + "github.com/iotaledger/hive.go/crypto/ed25519" "github.com/iotaledger/hive.go/events" + "github.com/iotaledger/hive.go/identity" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -126,9 +127,11 @@ func newTestPeer(name string, conn net.Conn) *peer.Peer { services := service.New() services.Update(service.PeeringKey, conn.LocalAddr().Network(), 0) services.Update(service.GossipKey, conn.LocalAddr().Network(), 0) - key := make([]byte, ed25519.PublicKeySize) - copy(key, name) - return peer.NewPeer(key, net.IPv4zero, services) + + var publicKey ed25519.PublicKey + copy(publicKey[:], name) + + return peer.NewPeer(identity.NewIdentity(publicKey), net.IPv4zero, services) } func newPipe() (net.Conn, net.Conn, func()) { diff --git a/packages/gossip/server/server.go b/packages/gossip/server/server.go index 80a1d183..133e92ef 100644 --- a/packages/gossip/server/server.go +++ b/packages/gossip/server/server.go @@ -17,6 +17,8 @@ import ( "github.com/iotaledger/hive.go/autopeering/peer/service" pb "github.com/iotaledger/hive.go/autopeering/server/proto" "github.com/iotaledger/hive.go/backoff" + "github.com/iotaledger/hive.go/crypto/ed25519" + "github.com/iotaledger/hive.go/identity" "github.com/iotaledger/hive.go/netutil" "go.uber.org/zap" ) @@ -72,9 +74,9 @@ type acceptMatcher struct { } type accept struct { - fromID peer.ID // ID of the connecting peer - req []byte // raw data of the handshake request - conn net.Conn // the actual network connection + fromID identity.ID // ID of the connecting peer + req []byte // raw data of the handshake request + conn net.Conn // the actual network connection } // ServeTCP creates the object and starts listening for incoming connections. @@ -297,7 +299,7 @@ func (t *TCP) listenLoop() { select { case t.acceptReceived <- accept{ - fromID: key.ID(), + fromID: identity.NewID(key), req: req, conn: conn, }: @@ -308,15 +310,15 @@ func (t *TCP) listenLoop() { } } -func (t *TCP) doHandshake(key peer.PublicKey, remoteAddr string, conn net.Conn) error { +func (t *TCP) doHandshake(key ed25519.PublicKey, remoteAddr string, conn net.Conn) error { reqData, err := newHandshakeRequest(remoteAddr) if err != nil { return err } pkt := &pb.Packet{ - PublicKey: t.local.PublicKey(), - Signature: t.local.Sign(reqData), + PublicKey: t.local.PublicKey().Bytes(), + Signature: t.local.Sign(reqData).Bytes(), Data: reqData, } b, err := proto.Marshal(pkt) @@ -353,7 +355,7 @@ func (t *TCP) doHandshake(key peer.PublicKey, remoteAddr string, conn net.Conn) } signer, err := peer.RecoverKeyFromSignedData(pkt) - if err != nil || !bytes.Equal(key, signer) { + if err != nil || !bytes.Equal(key.Bytes(), signer.Bytes()) { return ErrInvalidHandshake } if !t.validateHandshakeResponse(pkt.GetData(), reqData) { @@ -363,29 +365,29 @@ func (t *TCP) doHandshake(key peer.PublicKey, remoteAddr string, conn net.Conn) return nil } -func (t *TCP) readHandshakeRequest(conn net.Conn) (peer.PublicKey, []byte, error) { +func (t *TCP) readHandshakeRequest(conn net.Conn) (ed25519.PublicKey, []byte, error) { if err := conn.SetReadDeadline(time.Now().Add(handshakeTimeout)); err != nil { - return nil, nil, err + return ed25519.PublicKey{}, nil, err } b := make([]byte, maxHandshakePacketSize) n, err := conn.Read(b) if err != nil { - return nil, nil, fmt.Errorf("%w: %s", ErrInvalidHandshake, err.Error()) + return ed25519.PublicKey{}, nil, fmt.Errorf("%w: %s", ErrInvalidHandshake, err.Error()) } pkt := &pb.Packet{} err = proto.Unmarshal(b[:n], pkt) if err != nil { - return nil, nil, err + return ed25519.PublicKey{}, nil, err } key, err := peer.RecoverKeyFromSignedData(pkt) if err != nil { - return nil, nil, err + return ed25519.PublicKey{}, nil, err } if !t.validateHandshakeRequest(pkt.GetData()) { - return nil, nil, ErrInvalidHandshake + return ed25519.PublicKey{}, nil, ErrInvalidHandshake } return key, pkt.GetData(), nil @@ -398,8 +400,8 @@ func (t *TCP) writeHandshakeResponse(reqData []byte, conn net.Conn) error { } pkt := &pb.Packet{ - PublicKey: t.local.PublicKey(), - Signature: t.local.Sign(data), + PublicKey: t.local.PublicKey().Bytes(), + Signature: t.local.Sign(data).Bytes(), Data: data, } b, err := proto.Marshal(pkt) diff --git a/packages/gossip/server/server_test.go b/packages/gossip/server/server_test.go index 98385670..5c62ef5e 100644 --- a/packages/gossip/server/server_test.go +++ b/packages/gossip/server/server_test.go @@ -58,7 +58,7 @@ func TestUnansweredDial(t *testing.T) { // create peer with invalid gossip address services := getPeer(transA).Services().CreateRecord() services.Update(service.GossipKey, "tcp", 0) - unreachablePeer := peer.NewPeer(getPeer(transA).PublicKey(), net.ParseIP("127.0.0.1"), services) + unreachablePeer := peer.NewPeer(getPeer(transA).Identity, net.ParseIP("127.0.0.1"), services) _, err := transA.DialPeer(unreachablePeer) assert.Error(t, err) @@ -82,7 +82,7 @@ func TestNoHandshakeResponse(t *testing.T) { // create peer for the listener services := getPeer(transA).Services().CreateRecord() services.Update(service.GossipKey, lis.Addr().Network(), lis.Addr().(*net.TCPAddr).Port) - p := peer.NewPeer(getPeer(transA).PublicKey(), lis.Addr().(*net.TCPAddr).IP, services) + p := peer.NewPeer(getPeer(transA).Identity, lis.Addr().(*net.TCPAddr).IP, services) _, err = transA.DialPeer(p) assert.Error(t, err) diff --git a/plugins/autopeering/autopeering.go b/plugins/autopeering/autopeering.go index 658c39be..460bacd8 100644 --- a/plugins/autopeering/autopeering.go +++ b/plugins/autopeering/autopeering.go @@ -9,17 +9,20 @@ import ( "strconv" "strings" - "github.com/iotaledger/goshimmer/plugins/autopeering/local" - "github.com/iotaledger/goshimmer/plugins/banner" - "github.com/iotaledger/goshimmer/plugins/config" - "github.com/iotaledger/goshimmer/plugins/gossip" "github.com/iotaledger/hive.go/autopeering/discover" "github.com/iotaledger/hive.go/autopeering/peer" "github.com/iotaledger/hive.go/autopeering/peer/service" "github.com/iotaledger/hive.go/autopeering/selection" "github.com/iotaledger/hive.go/autopeering/server" + "github.com/iotaledger/hive.go/crypto/ed25519" + "github.com/iotaledger/hive.go/identity" "github.com/iotaledger/hive.go/logger" "github.com/iotaledger/hive.go/node" + + "github.com/iotaledger/goshimmer/plugins/autopeering/local" + "github.com/iotaledger/goshimmer/plugins/banner" + "github.com/iotaledger/goshimmer/plugins/config" + "github.com/iotaledger/goshimmer/plugins/gossip" ) // autopeering constants @@ -160,11 +163,15 @@ func parseEntryNodes() (result []*peer.Peer, err error) { if err != nil { return nil, fmt.Errorf("%w: host cannot be resolved: %s", ErrParsingMasterNode, err) } + publicKey, err, _ := ed25519.PublicKeyFromBytes(pubKey) + if err != nil { + return nil, err + } services := service.New() services.Update(service.PeeringKey, addr.Network(), addr.Port) - result = append(result, peer.NewPeer(pubKey, addr.IP, services)) + result = append(result, peer.NewPeer(identity.NewIdentity(publicKey), addr.IP, services)) } return result, nil diff --git a/plugins/spa/explorer_routes.go b/plugins/spa/explorer_routes.go index 448a57e9..e42e3f26 100644 --- a/plugins/spa/explorer_routes.go +++ b/plugins/spa/explorer_routes.go @@ -26,7 +26,7 @@ type ExplorerTx struct { func createExplorerTx(tx *message.Message) (*ExplorerTx, error) { transactionId := tx.GetId() - txMetadata := messagelayer.Tangle.GetTransactionMetadata(transactionId) + txMetadata := messagelayer.Tangle.MessageMetadata(transactionId) t := &ExplorerTx{ Hash: transactionId.String(), @@ -116,7 +116,7 @@ func setupExplorerRoutes(routeGroup *echo.Group) { } func findTransaction(transactionId message.Id) (explorerTx *ExplorerTx, err error) { - if !messagelayer.Tangle.GetTransaction(transactionId).Consume(func(transaction *message.Message) { + if !messagelayer.Tangle.Message(transactionId).Consume(func(transaction *message.Message) { explorerTx, err = createExplorerTx(transaction) }) { err = errors.Wrapf(ErrNotFound, "tx hash: %s", transactionId.String()) diff --git a/plugins/webapi/getNeighbors/plugin.go b/plugins/webapi/getNeighbors/plugin.go index 5f4f4567..acedd3f3 100644 --- a/plugins/webapi/getNeighbors/plugin.go +++ b/plugins/webapi/getNeighbors/plugin.go @@ -39,7 +39,7 @@ func getNeighbors(c echo.Context) error { for _, peer := range autopeering.Discovery.GetVerifiedPeers() { n := Neighbor{ ID: peer.ID().String(), - PublicKey: base64.StdEncoding.EncodeToString(peer.PublicKey()), + PublicKey: base64.StdEncoding.EncodeToString(peer.PublicKey().Bytes()), } n.Services = getServices(peer) knownPeers = append(knownPeers, n) @@ -49,7 +49,7 @@ func getNeighbors(c echo.Context) error { for _, peer := range autopeering.Selection.GetOutgoingNeighbors() { n := Neighbor{ ID: peer.ID().String(), - PublicKey: base64.StdEncoding.EncodeToString(peer.PublicKey()), + PublicKey: base64.StdEncoding.EncodeToString(peer.PublicKey().Bytes()), } n.Services = getServices(peer) chosen = append(chosen, n) @@ -57,7 +57,7 @@ func getNeighbors(c echo.Context) error { for _, peer := range autopeering.Selection.GetIncomingNeighbors() { n := Neighbor{ ID: peer.ID().String(), - PublicKey: base64.StdEncoding.EncodeToString(peer.PublicKey()), + PublicKey: base64.StdEncoding.EncodeToString(peer.PublicKey().Bytes()), } n.Services = getServices(peer) accepted = append(accepted, n) -- GitLab