From 454141bc8dbefe542e5fe2ed562f6ce81d0b4895 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 15 Mar 2021 18:56:04 +0200 Subject: [PATCH 01/29] add go-tools --- go-tools/README.MD | 3 + go-tools/blowballs/blowballs.go | 35 ++++ go-tools/chrysalis-attacks.iml | 21 +++ go-tools/go.mod | 11 ++ go-tools/honest spam/README.MD | 3 + go-tools/honest spam/honest.go | 66 +++++++ go-tools/lib/lib.go | 164 ++++++++++++++++++ go-tools/lib/merkle_hasher.go | 120 +++++++++++++ go-tools/lib/milestone.go | 138 +++++++++++++++ go-tools/milestone_out_of_order/README.MD | 3 + .../milestone_out_of_order.go | 69 ++++++++ go-tools/semi-lazy-attack/README.MD | 3 + go-tools/semi-lazy-attack/semi-lazy-attack.go | 100 +++++++++++ go-tools/value conflicts/value_conflicts.go | 47 +++++ 14 files changed, 783 insertions(+) create mode 100644 go-tools/README.MD create mode 100644 go-tools/blowballs/blowballs.go create mode 100644 go-tools/chrysalis-attacks.iml create mode 100644 go-tools/go.mod create mode 100644 go-tools/honest spam/README.MD create mode 100644 go-tools/honest spam/honest.go create mode 100644 go-tools/lib/lib.go create mode 100644 go-tools/lib/merkle_hasher.go create mode 100644 go-tools/lib/milestone.go create mode 100644 go-tools/milestone_out_of_order/README.MD create mode 100644 go-tools/milestone_out_of_order/milestone_out_of_order.go create mode 100644 go-tools/semi-lazy-attack/README.MD create mode 100644 go-tools/semi-lazy-attack/semi-lazy-attack.go create mode 100644 go-tools/value conflicts/value_conflicts.go diff --git a/go-tools/README.MD b/go-tools/README.MD new file mode 100644 index 0000000..57fcce2 --- /dev/null +++ b/go-tools/README.MD @@ -0,0 +1,3 @@ +# Chrysalis Testing Tools + +This is a suit of various tools that are used to perform various tests and attacks on the tangle. The `lib` package is to be used as an internal dependency. The other folders contain standalone test scripts. diff --git a/go-tools/blowballs/blowballs.go b/go-tools/blowballs/blowballs.go new file mode 100644 index 0000000..e6b2200 --- /dev/null +++ b/go-tools/blowballs/blowballs.go @@ -0,0 +1,35 @@ +package main + +import ( + "encoding/hex" + "flag" + "fmt" + . "github.com/iotaledger/chrysalis-tools/go-tests/lib" + iota "github.com/iotaledger/iota.go/v2" +) + +const blowballSize = 10 + +func main() { + endpoint := flag.String("endpoint", "http://chrysalis-net.twilightparadox.com:14266", "endpoint") + nodeAPI := iota.NewNodeAPIClient(*endpoint) + + for { + nodeInfo, err := nodeAPI.Info() + Must(err) + milestoneResponse, err := nodeAPI.MilestoneByIndex(nodeInfo.LatestMilestoneIndex) + Must(err) + messageIdBytes, err := hex.DecodeString(milestoneResponse.MessageID) + Must(err) + var parent iota.MessageID + copy(parent[:], messageIdBytes) + parents := []iota.MessageID{parent} + for i := 0; i < blowballSize; i++ { + m := SendDataMessage(nodeAPI, &nodeInfo.NetworkID, &parents, "blowball", string(i)) + id, err := m.ID() + Must(err) + fmt.Println("sent blowball message ", hex.EncodeToString(id[:])) + } + + } +} diff --git a/go-tools/chrysalis-attacks.iml b/go-tools/chrysalis-attacks.iml new file mode 100644 index 0000000..aad2efc --- /dev/null +++ b/go-tools/chrysalis-attacks.iml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/go-tools/go.mod b/go-tools/go.mod new file mode 100644 index 0000000..ba2db50 --- /dev/null +++ b/go-tools/go.mod @@ -0,0 +1,11 @@ +module github.com/iotaledger/chrysalis-tools/go-tests + +go 1.15 + +require ( + github.com/eclipse/paho.mqtt.golang v1.3.2 + github.com/iotaledger/iota.go/v2 v2.0.0-20210309092402-a4a03ab62bd2 + github.com/kr/pretty v0.1.0 // indirect + golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect +) diff --git a/go-tools/honest spam/README.MD b/go-tools/honest spam/README.MD new file mode 100644 index 0000000..ced512c --- /dev/null +++ b/go-tools/honest spam/README.MD @@ -0,0 +1,3 @@ +#Honest Spam + +Sends in data messages using the default api. It keeps track of the confirmation rate via MQTT and prints it. This tool should be used in parallel to other attacks running on the tangle. \ No newline at end of file diff --git a/go-tools/honest spam/honest.go b/go-tools/honest spam/honest.go new file mode 100644 index 0000000..27ca2ff --- /dev/null +++ b/go-tools/honest spam/honest.go @@ -0,0 +1,66 @@ +package main + +import ( + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "github.com/eclipse/paho.mqtt.golang" + . "github.com/iotaledger/chrysalis-tools/go-tests/lib" + iota "github.com/iotaledger/iota.go/v2" + "log" +) + +var ( + totalMessageCounter uint = 0 + totalMessageConfirmed uint = 0 + unconfirmedMessages = make(map[string]struct{}) +) + +const ( + nodeUrl = LocalHost + apiPort = ApiPort + mqttPort = MqttPort +) + +func main() { + endpoint := flag.String("endpoint", fmt.Sprintf("http://%s:%d", nodeUrl, apiPort), "endpoint") + nodeAPI := iota.NewNodeAPIClient(*endpoint) + client := SetUpMqTT(nodeUrl, mqttPort, nil, nil, nil) + info, err := nodeAPI.Info() + Must(err) + + Must(err) + + var i uint32 = 0 + for { + i++ + msg := CreateDataMessage(nodeAPI, &info.NetworkID, nil, "honest", string(i)) + message, err := nodeAPI.SubmitMessage(msg) + Must(err) + totalMessageCounter++ + msgId, err := message.ID() + Must(err) + id := hex.EncodeToString(msgId[:]) + subToConfirm(client, &id) + unconfirmedMessages[id] = struct{}{} + } + +} + +func subToConfirm(client mqtt.Client, msgId *string) { + client.Subscribe(fmt.Sprintf("messages/%s/metadata", *msgId), 1, + func(_ mqtt.Client, msg mqtt.Message) { + metadata := iota.MessageMetadataResponse{} + err := json.Unmarshal(msg.Payload(), &metadata) + Must(err) + if _, ok := unconfirmedMessages[metadata.MessageID]; ok && metadata.ReferencedByMilestoneIndex != nil { + { + totalMessageConfirmed++ + delete(unconfirmedMessages, *msgId) + log.Printf("%s confirmed\n", *msgId) + log.Printf("confirmation ratio is %.2f\n", float32(totalMessageConfirmed)/float32(totalMessageCounter)) + } + } + }) +} diff --git a/go-tools/lib/lib.go b/go-tools/lib/lib.go new file mode 100644 index 0000000..b80705f --- /dev/null +++ b/go-tools/lib/lib.go @@ -0,0 +1,164 @@ +package lib + +import ( + "encoding/hex" + "flag" + "fmt" + mqtt "github.com/eclipse/paho.mqtt.golang" + . "github.com/iotaledger/iota.go/v2" + ed "github.com/iotaledger/iota.go/v2/ed25519" +) + +const ( + ApiPort = 14265 + MqttPort = 1883 + LocalHost = "127.0.0.1" +) + +var ( + BalanceSeed = []byte{0xde, 0xad, 0xbe, 0xef} + NullMessageId = MessageID{} +) + +func Must(err error) { + if err != nil { + panic(err) + } +} + +func ObtainAPI(nodeUrl string, apiPort int) (*NodeAPIClient, *NodeInfoResponse) { + endpoint := flag.String("endpoint", fmt.Sprintf("http://%s:%d", nodeUrl, apiPort), "endpoint") + nodeAPI := NewNodeAPIClient(*endpoint) + info, err := nodeAPI.Info() + Must(err) + return nodeAPI, info +} + +func SetUpMqTT(broker string, port uint, messagePubHandler func(client mqtt.Client, msg mqtt.Message), + connectHandler func(client mqtt.Client), connectLostHandler func(client mqtt.Client, err error)) mqtt.Client { + + if messagePubHandler == nil { + messagePubHandler = func(client mqtt.Client, msg mqtt.Message) { + fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic()) + } + } + + if connectHandler == nil { + connectHandler = func(client mqtt.Client) { + fmt.Println("Connected") + } + } + + if connectLostHandler == nil { + connectLostHandler = func(client mqtt.Client, err error) { + fmt.Printf("Connect lost: %v", err) + } + } + + opts := mqtt.NewClientOptions() + opts.AddBroker(fmt.Sprintf("tcp://%s:%d", broker, port)) + opts.SetDefaultPublishHandler(messagePubHandler) + opts.OnConnect = connectHandler + opts.OnConnectionLost = connectLostHandler + client := mqtt.NewClient(opts) + if token := client.Connect(); token.Wait() && token.Error() != nil { + panic(token.Error()) + } + + return client +} + +func SendDataMessage(api *NodeAPIClient, networkId *string, parents *MessageIDs, index string, data string) *Message { + m := CreateDataMessage(api, networkId, parents, index, data) + + message, err := api.SubmitMessage(m) + Must(err) + return message +} + +func CreateDataMessage(api *NodeAPIClient, networkId *string, parents *MessageIDs, index string, data string) *Message { + m := &Message{} + m.NetworkID = NetworkIDFromString(*networkId) + m.Payload = &Indexation{Index: []byte(index), Data: []byte(data)} + m.Parents = *getParentsIfNil(api, parents) + return m +} + +func SendValueMessage(api *NodeAPIClient, networkId *string, parents *MessageIDs, tx *Transaction) *Message { + m := CreateValueMessage(api, networkId, parents, tx) + message, err := api.SubmitMessage(m) + Must(err) + return message +} + +func CreateValueMessage(api *NodeAPIClient, networkId *string, parents *MessageIDs, tx *Transaction) *Message { + m := &Message{} + m.NetworkID = NetworkIDFromString(*networkId) + m.Payload = tx + m.Parents = *getParentsIfNil(api, parents) + return m +} + +func getParentsIfNil(api *NodeAPIClient, parents *MessageIDs) *MessageIDs { + if parents == nil { + tipsResponse, err := api.Tips() + Must(err) + tips := tipsResponse.Tips + parents = &MessageIDs{} + for _, tip := range tips { + decodeString, err := hex.DecodeString(tip) + Must(err) + var parent MessageID + copy(parent[:], decodeString[:]) + *parents = append(*parents, parent) + } + + } + return parents +} + +func GenerateKeys(seed []byte) (ed.PrivateKey, ed.PublicKey) { + privateKey := ed.NewKeyFromSeed(seed) + publicKey := make([]byte, ed.PublicKeySize) + copy(publicKey, privateKey[32:]) + return privateKey, publicKey +} + +func CreateInput(inputAddress Address, txId [32]byte, outIndex uint16) *ToBeSignedUTXOInput { + input := UTXOInput{ + TransactionID: txId, + TransactionOutputIndex: outIndex, + } + + return &ToBeSignedUTXOInput{ + Address: inputAddress, + Input: &input, + } +} + +func CreateOutput(outputAddress Address, amount uint64) *SigLockedSingleOutput { + return &SigLockedSingleOutput{ + Address: outputAddress, + Amount: amount, + } +} + +func CreateSeed(pattern []byte) []byte { + seed := make([]byte, ed.SeedSize) + + // Copy the pattern into the start of the container + copy(seed, pattern) + + // Incrementally duplicate the pattern throughout the container + for j := len(pattern); j < len(seed); j *= 2 { + copy(seed[j:], seed[:j]) + } + + return seed +} + +func GenerateAddressFromSeed(seed []byte) (ed.PrivateKey, ed.PublicKey, Ed25519Address) { + privateKey, publicKey := GenerateKeys(seed) + address := AddressFromEd25519PubKey(publicKey) + return privateKey, publicKey, address +} diff --git a/go-tools/lib/merkle_hasher.go b/go-tools/lib/merkle_hasher.go new file mode 100644 index 0000000..2d2baa1 --- /dev/null +++ b/go-tools/lib/merkle_hasher.go @@ -0,0 +1,120 @@ +package lib + +/**shamelessly copied from hornet**/ + +import ( + "crypto" + "encoding" + "encoding/hex" + iotago "github.com/iotaledger/iota.go/v2" + "math/bits" +) + +/*************************** Types To be used externally by hasher *************************************************************/ + +// MarshableID is the ID of a Message. +type MarshableID []byte + +// MarshableIDs is a slice of MarshableID. +type MarshableIDs []MarshableID + +// ToHex converts the MarshableID to its hex representation. +func (m MarshableID) ToHex() string { + return hex.EncodeToString(m) +} + +// ToArray converts the MarshableID to an array. +func (m MarshableID) ToArray() iotago.MessageID { + var messageID iotago.MessageID + copy(messageID[:], m) + return messageID +} + +// ToMapKey converts the MarshableID to a string that can be used as a map key. +func (m MarshableID) ToMapKey() string { + return string(m) +} + +// MarshalBinary implements the encoding.BinaryMarshaler interface. +func (m MarshableID) MarshalBinary() ([]byte, error) { + return m, nil +} + +/**********************************************Hasher************************************************/ + +// Domain separation prefixes +const ( + LeafHashPrefix = 0 + NodeHashPrefix = 1 +) + +// Hasher implements the hashing algorithm described in the IOTA protocol RFC-12. +type Hasher struct { + hash crypto.Hash +} + +// NewHasher creates a new Hasher using the provided hash function. +func NewHasher(h crypto.Hash) *Hasher { + return &Hasher{hash: h} +} + +// Size returns the length, in bytes, of a digest resulting from the given hash function. +func (t *Hasher) Size() int { + return t.hash.Size() +} + +// EmptyRoot returns a special case for an empty tree. +// This is equivalent to Hash(nil). +func (t *Hasher) EmptyRoot() []byte { + return t.hash.New().Sum(nil) +} + +// Hash computes the Merkle tree hash of the provided data encodings. +func (t *Hasher) Hash(data []encoding.BinaryMarshaler) ([]byte, error) { + if len(data) == 0 { + return t.EmptyRoot(), nil + } + if len(data) == 1 { + return t.hashLeaf(data[0]) + } + + k := largestPowerOfTwo(len(data)) + l, err := t.Hash(data[:k]) + if err != nil { + return nil, err + } + r, err := t.Hash(data[k:]) + if err != nil { + return nil, err + } + return t.hashNode(l, r), nil +} + +// hashLeaf returns the Merkle tree leaf hash of data. +func (t *Hasher) hashLeaf(data encoding.BinaryMarshaler) ([]byte, error) { + b, err := data.MarshalBinary() + if err != nil { + return nil, err + } + h := t.hash.New() + h.Write([]byte{LeafHashPrefix}) + h.Write(b) + return h.Sum(nil), nil +} + +// hashNode returns the inner Merkle tree node hash of the two child nodes l and r. +func (t *Hasher) hashNode(l, r []byte) []byte { + h := t.hash.New() + h.Write([]byte{NodeHashPrefix}) + h.Write(l) + h.Write(r) + return h.Sum(nil) +} + +// largestPowerOfTwo returns the largest power of two less than n. +func largestPowerOfTwo(x int) int { + if x < 2 { + panic("invalid value") + } + return 1 << (bits.Len(uint(x-1)) - 1) +} diff --git a/go-tools/lib/milestone.go b/go-tools/lib/milestone.go new file mode 100644 index 0000000..c9ed11c --- /dev/null +++ b/go-tools/lib/milestone.go @@ -0,0 +1,138 @@ +package lib + +import ( + "crypto" + "encoding" + "encoding/hex" + . "github.com/iotaledger/iota.go/v2" + ed "github.com/iotaledger/iota.go/v2/ed25519" +) + +const ( + MilestonePrivate = "ef13abedef13abedef13abedef13abedef13abedef13abedef13abedef13abed" + MilestonePublic = "6ce02bb80d2db7759863543278b3f04e5f945131077574148b1907d692f80e7c" +) + +var ( + MilestoneSeed = []byte{0xef, 0x13, 0xab, 0xed} +) + +func SendMilestone(api *NodeAPIClient, networkId *string, parents MessageIDs, milestone Milestone) *Message { + message := CreateMilestoneMessage(networkId, parents, milestone) + msg, err := api.SubmitMessage(message) + Must(err) + return msg +} + +func CreateMilestoneMessage(networkId *string, parents MessageIDs, milestone Milestone) *Message { + if parents == nil { + parents = milestone.Parents + } + msg := Message{ + NetworkID: NetworkIDFromString(*networkId), + Parents: parents, + Payload: &milestone, + } + + return &msg +} + +func CreateSignedMilestone(index uint32, timestamp uint64, parents MilestoneParentMessageIDs, proof MilestoneInclusionMerkleProof, publicKeys []MilestonePublicKey, reciepts Serializable, keyMap MilestonePublicKeyMapping) Milestone { + milestone := CreateMilestone(index, timestamp, parents, proof, publicKeys, reciepts, nil) + essence, err := milestone.Essence() + Must(err) + milestone.Signatures = SignMilstoneEssence(keyMap, publicKeys, essence) + return milestone +} + +func CreateMilestone(index uint32, timestamp uint64, parents MilestoneParentMessageIDs, proof MilestoneInclusionMerkleProof, publicKeys []MilestonePublicKey, reciepts Serializable, sigs []MilestoneSignature) Milestone { + return Milestone{ + Index: index, + Timestamp: timestamp, + Parents: parents, + InclusionMerkleProof: proof, + PublicKeys: publicKeys, + Receipt: reciepts, + Signatures: sigs, + } +} + +func CreateMilestoneInclusionMerkleProof(msgIds MessageIDs) MilestoneInclusionMerkleProof { + hasher := NewHasher(crypto.BLAKE2b_256) + marshalers := make([]encoding.BinaryMarshaler, len(msgIds)) + for i, msgId := range msgIds { + var marshId MarshableID + copy(marshId, msgId[:]) + marshalers[i] = marshId + } + hash, err := hasher.Hash(marshalers) + Must(err) + proof := MilestoneInclusionMerkleProof{} + for i, b := range hash { + proof[i] = b + } + return proof +} + +func CreateMilestoneKeyMapping(privateKeys []ed.PrivateKey, publicKeys []MilestonePublicKey) MilestonePublicKeyMapping { + if len(privateKeys) != len(publicKeys) { + panic("private and public keys should be of the same length") + } + milestonePublicKeyMapping := MilestonePublicKeyMapping{} + for i := range publicKeys { + milestonePublicKeyMapping[publicKeys[i]] = privateKeys[i] + } + + return milestonePublicKeyMapping +} + +func CreateMilestoneKeyStringMapping(privateKeys []string, publicKeys []string) MilestonePublicKeyMapping { + privateArr := []ed.PrivateKey{} + for _, key := range privateKeys { + decodeKey, err := hex.DecodeString(key) + Must(err) + privateArr = append(privateArr, decodeKey) + } + + publicArr := []MilestonePublicKey{} + for _, key := range publicKeys { + decodeKey, err := hex.DecodeString(key) + Must(err) + pubKey := MilestonePublicKey{} + copy(pubKey[:], decodeKey) + publicArr = append(publicArr, pubKey) + } + + return CreateMilestoneKeyMapping(privateArr, publicArr) +} + +func FlattenKeyMap(milestoneKeyMapping MilestonePublicKeyMapping) ([]ed.PrivateKey, []MilestonePublicKey) { + var milestonePrivateKeys []ed.PrivateKey + var milestonePublicKeys []MilestonePublicKey + for k, v := range milestoneKeyMapping { + milestonePrivateKeys = append(milestonePrivateKeys, v) + milestonePublicKeys = append(milestonePublicKeys, k) + } + + return milestonePrivateKeys, milestonePublicKeys +} + +func SignMilestone(keyMap MilestonePublicKeyMapping, pubKeys []MilestonePublicKey, milestone Milestone) []MilestoneSignature { + essence, err := milestone.Essence() + Must(err) + return SignMilstoneEssence(keyMap, pubKeys, essence) +} + +func GenerateMilestoneKeys(seed []byte) (ed.PrivateKey, MilestonePublicKey) { + privateKey := ed.NewKeyFromSeed(seed) + publicKey := MilestonePublicKey{} + copy(publicKey[:], privateKey[32:]) + return privateKey, publicKey +} + +func SignMilstoneEssence(keyMap MilestonePublicKeyMapping, pubKeys []MilestonePublicKey, essence []byte) []MilestoneSignature { + signer := InMemoryEd25519MilestoneSigner(keyMap) + signatures, err := signer(pubKeys, essence) + Must(err) + return signatures +} diff --git a/go-tools/milestone_out_of_order/README.MD b/go-tools/milestone_out_of_order/README.MD new file mode 100644 index 0000000..54683d6 --- /dev/null +++ b/go-tools/milestone_out_of_order/README.MD @@ -0,0 +1,3 @@ +#Milestones out of order + +This attack generates milestones with indexes out of order that confirm conflicting value transactions. The point is to imitate a condition where nodes receive milestones out of order. \ No newline at end of file diff --git a/go-tools/milestone_out_of_order/milestone_out_of_order.go b/go-tools/milestone_out_of_order/milestone_out_of_order.go new file mode 100644 index 0000000..27a096e --- /dev/null +++ b/go-tools/milestone_out_of_order/milestone_out_of_order.go @@ -0,0 +1,69 @@ +package main + +import ( + . "github.com/iotaledger/chrysalis-tools/go-tests/lib" + iota "github.com/iotaledger/iota.go/v2" + ed "github.com/iotaledger/iota.go/v2/ed25519" + "time" +) + +const ( + nodeUrl = LocalHost + apiPort = ApiPort +) + +func main() { + nodeAPI, info := ObtainAPI(nodeUrl, apiPort) + + //TODO specify correct genesis address and output + genesisAddress := iota.Ed25519Address{} + genesisOutput := [iota.TransactionIDLength]byte{} + + seed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) + privateKey, _, address1 := GenerateAddressFromSeed(seed) + signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ + Address: &address1, + Keys: &privateKey, + }) + + tx, err := iota.NewTransactionBuilder(). + AddInput(CreateInput(&genesisAddress, genesisOutput, 0)). + AddOutput(CreateOutput(&address1, 825)). + AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). + Build(signer) + Must(err) + + message1 := SendValueMessage(nodeAPI, &info.NetworkID, &iota.MessageIDs{iota.MessageID{}}, tx) + + tx, err = iota.NewTransactionBuilder(). + AddInput(CreateInput(&genesisAddress, genesisOutput, 0)). + AddOutput(CreateOutput(&address1, 700)). + AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). + Build(signer) + Must(err) + + message2 := SendValueMessage(nodeAPI, &info.NetworkID, &iota.MessageIDs{iota.MessageID{}}, tx) + + //**** Set Up Milestone ****/ + + milestoneSeed := CreateSeed([]byte{0xef, 0x13, 0xab, 0xed}) + privateKey, milestonePublicKey := GenerateMilestoneKeys(milestoneSeed) + keyMap := CreateMilestoneKeyMapping([]ed.PrivateKey{privateKey}, []iota.MilestonePublicKey{milestonePublicKey}) + + id, err := message2.ID() + Must(err) + sendMilestone(id, milestonePublicKey, keyMap, nodeAPI, info) + + id, err = message1.ID() + Must(err) + sendMilestone(id, milestonePublicKey, keyMap, nodeAPI, info) + +} + +func sendMilestone(id *iota.MessageID, milestonePublicKey iota.MilestonePublicKey, keyMap iota.MilestonePublicKeyMapping, nodeAPI *iota.NodeAPIClient, info *iota.NodeInfoResponse) { + parents := iota.MessageIDs{*id} + proof := CreateMilestoneInclusionMerkleProof(parents) + milestone := CreateSignedMilestone(2, uint64(time.Now().Unix()), parents, proof, []iota.MilestonePublicKey{milestonePublicKey}, + nil, keyMap) + SendMilestone(nodeAPI, &info.NetworkID, parents, milestone) +} diff --git a/go-tools/semi-lazy-attack/README.MD b/go-tools/semi-lazy-attack/README.MD new file mode 100644 index 0000000..792440f --- /dev/null +++ b/go-tools/semi-lazy-attack/README.MD @@ -0,0 +1,3 @@ +# Semi-Lazy Attack + +Attempts to reference a non-lazy transaction and a transaction on the verge of becoming semi-lazy. Then it should create a tip explosion on top of the newly created message to attract honest messages. Attempting to turn honest transactions to semi-lazy ones. \ No newline at end of file diff --git a/go-tools/semi-lazy-attack/semi-lazy-attack.go b/go-tools/semi-lazy-attack/semi-lazy-attack.go new file mode 100644 index 0000000..80dd09f --- /dev/null +++ b/go-tools/semi-lazy-attack/semi-lazy-attack.go @@ -0,0 +1,100 @@ +package main + +import ( + "flag" + "fmt" + "github.com/eclipse/paho.mqtt.golang" + . "github.com/iotaledger/chrysalis-tools/go-tests/lib" + iota "github.com/iotaledger/iota.go/v2" + "golang.org/x/crypto/blake2b" +) + +const semLazyExplosionSize = 10 + +var nodeApi *iota.NodeAPIClient +var msQueue []uint32 +var info *iota.NodeInfoResponse + +func main() { + endpoint := flag.String("endpoint", "http://localhost:14265", "endpoint") + nodeApi = iota.NewNodeAPIClient(*endpoint) + var err error + info, err = nodeApi.Info() + Must(err) + + fmt.Println("Listening..") + client := SetUpMqTT("http://chrysalis-net.twilightparadox.com", 1883, nil, nil, nil) + sub(client) + select {} +} + +func sub(client mqtt.Client) (mqtt.Token, mqtt.Token) { + messageToken := client.Subscribe("messages", 1, censor) + milestoneToken := client.Subscribe("milestones/solid", 1, rcvMilestone) + + messageToken.Wait() + milestoneToken.Wait() + + //currently milestone is not important + return messageToken, milestoneToken +} + +func rcvMilestone(client mqtt.Client, msg mqtt.Message) { + milestone := iota.Milestone{} + err := milestone.UnmarshalJSON(msg.Payload()) + Must(err) + if len(msQueue) >= 15 { + msQueue = msQueue[1:] + } + msQueue = append(msQueue, milestone.Index) + fmt.Println("add ms index ", milestone.Index) +} + +func censor(client mqtt.Client, msg mqtt.Message) { + fmt.Println("start censoring") + msgId := getMessageId(msg) + semLazyMs := getSemLazyMs() + vergeOfBecomingSemLazyMsg := send_sem_lazy(msgId, semLazyMs, -1) + for i := 0; i < semLazyExplosionSize; i++ { + id, err := vergeOfBecomingSemLazyMsg.ID() + Must(err) + stitch(*id, getLatestMsId(), i) + } +} + +func getLatestMsId() iota.MessageID { + info, err := nodeApi.Info() + Must(err) + ms, err := nodeApi.MilestoneByIndex(info.LatestMilestoneIndex) + Must(err) + msgId, err := iota.MessageIDFromHexString(ms.MessageID) + Must(err) + return msgId +} + +func send_sem_lazy(id iota.MessageID, ms iota.MessageID, num int) *iota.Message { + fmt.Println("sending a tx on the verge of being semi-lazy") + parents := iota.RemoveDupsAndSortByLexicalOrderArrayOf32Bytes(iota.MessageIDs{id, ms}) + return SendDataMessage(nodeApi, &info.NetworkID, &parents, "semlazy", string(num)) +} + +func stitch(id iota.MessageID, ms iota.MessageID, stichnum int) *iota.Message { + fmt.Println("sending a stitch") + parents := iota.RemoveDupsAndSortByLexicalOrderArrayOf32Bytes(iota.MessageIDs{id, ms}) + return SendDataMessage(nodeApi, &info.NetworkID, &parents, "censor stitch", string(stichnum)) +} + +func getSemLazyMs() iota.MessageID { + info, err := nodeApi.Info() + Must(err) + solidMilestoneIndex := info.ConfirmedMilestoneIndex + msResp, err := nodeApi.MilestoneByIndex(solidMilestoneIndex - 13) + Must(err) + msgId, err := iota.MessageIDFromHexString(msResp.MessageID) + Must(err) + return msgId +} + +func getMessageId(msg mqtt.Message) iota.MessageID { + return blake2b.Sum256(msg.Payload()) +} diff --git a/go-tools/value conflicts/value_conflicts.go b/go-tools/value conflicts/value_conflicts.go new file mode 100644 index 0000000..c88b1ed --- /dev/null +++ b/go-tools/value conflicts/value_conflicts.go @@ -0,0 +1,47 @@ +package main + +import ( + "flag" + "fmt" + . "github.com/iotaledger/chrysalis-tools/go-tests/lib" + iota "github.com/iotaledger/iota.go/v2" +) + +const ( + nodeUrl = LocalHost + apiPort = ApiPort +) + +func main() { + endpoint := flag.String("endpoint", fmt.Sprintf("http://%s:%d", nodeUrl, apiPort), "endpoint") + nodeAPI := iota.NewNodeAPIClient(*endpoint) + info, err := nodeAPI.Info() + Must(err) + + genesisAddress := iota.Ed25519Address{} + genesisOutput := [iota.TransactionIDLength]byte{} + + seed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) + privateKey, _, address1 := GenerateAddressFromSeed(seed) + signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ + Address: &address1, + Keys: &privateKey, + }) + + tx, err := iota.NewTransactionBuilder(). + AddInput(CreateInput(&genesisAddress, genesisOutput, 0)). + AddOutput(CreateOutput(&address1, 825)). + AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). + Build(signer) + Must(err) + + SendValueMessage(nodeAPI, &info.NetworkID, nil, tx) + + tx, err = iota.NewTransactionBuilder(). + AddInput(CreateInput(&genesisAddress, genesisOutput, 0)). + AddOutput(CreateOutput(&address1, 825)). + AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). + Build(signer) + Must(err) + +} From d42d6973a70c94c8c905feb34720795618f17382 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 15 Mar 2021 19:11:08 +0200 Subject: [PATCH 02/29] change to localhost --- go-tools/semi-lazy-attack/semi-lazy-attack.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go-tools/semi-lazy-attack/semi-lazy-attack.go b/go-tools/semi-lazy-attack/semi-lazy-attack.go index 80dd09f..63bd9cb 100644 --- a/go-tools/semi-lazy-attack/semi-lazy-attack.go +++ b/go-tools/semi-lazy-attack/semi-lazy-attack.go @@ -23,7 +23,7 @@ func main() { Must(err) fmt.Println("Listening..") - client := SetUpMqTT("http://chrysalis-net.twilightparadox.com", 1883, nil, nil, nil) + client := SetUpMqTT("http://localhost", 1883, nil, nil, nil) sub(client) select {} } From 5451f6e36781d59108e319a9545718c8b2bcf541 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 22 Mar 2021 16:42:54 +0200 Subject: [PATCH 03/29] lib.go --- go-tools/lib/lib.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/go-tools/lib/lib.go b/go-tools/lib/lib.go index b80705f..6f3216e 100644 --- a/go-tools/lib/lib.go +++ b/go-tools/lib/lib.go @@ -15,20 +15,22 @@ const ( LocalHost = "127.0.0.1" ) -var ( - BalanceSeed = []byte{0xde, 0xad, 0xbe, 0xef} - NullMessageId = MessageID{} -) - func Must(err error) { if err != nil { panic(err) } } +func DefineNodeFlags() (*string, *int) { + nodeDomain := flag.String("node", LocalHost, "Can be either domain name or ip of the node") + blowballSize :=flag.Int("port", ApiPort, "Api port") + + return nodeDomain, blowballSize +} + func ObtainAPI(nodeUrl string, apiPort int) (*NodeAPIClient, *NodeInfoResponse) { - endpoint := flag.String("endpoint", fmt.Sprintf("http://%s:%d", nodeUrl, apiPort), "endpoint") - nodeAPI := NewNodeAPIClient(*endpoint) + endpoint := fmt.Sprintf("http://%s:%d", nodeUrl, apiPort) + nodeAPI := NewNodeAPIClient(endpoint) info, err := nodeAPI.Info() Must(err) return nodeAPI, info From e4f0a94a30fdb26dd3c003bc14c0b30767cf5dd8 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 22 Mar 2021 16:43:24 +0200 Subject: [PATCH 04/29] change blowballs --- go-tools/blowballs/blowballs.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/go-tools/blowballs/blowballs.go b/go-tools/blowballs/blowballs.go index e6b2200..6ba3d19 100644 --- a/go-tools/blowballs/blowballs.go +++ b/go-tools/blowballs/blowballs.go @@ -8,15 +8,14 @@ import ( iota "github.com/iotaledger/iota.go/v2" ) -const blowballSize = 10 - func main() { - endpoint := flag.String("endpoint", "http://chrysalis-net.twilightparadox.com:14266", "endpoint") - nodeAPI := iota.NewNodeAPIClient(*endpoint) + nodeDomain, apiPort := DefineNodeFlags() + blowballSize := flag.Int("blowball", 10, "size of a single blowball") + flag.Parse() + + nodeAPI, nodeInfo := ObtainAPI(*nodeDomain, *apiPort) for { - nodeInfo, err := nodeAPI.Info() - Must(err) milestoneResponse, err := nodeAPI.MilestoneByIndex(nodeInfo.LatestMilestoneIndex) Must(err) messageIdBytes, err := hex.DecodeString(milestoneResponse.MessageID) @@ -24,7 +23,7 @@ func main() { var parent iota.MessageID copy(parent[:], messageIdBytes) parents := []iota.MessageID{parent} - for i := 0; i < blowballSize; i++ { + for i := 0; i < *blowballSize; i++ { m := SendDataMessage(nodeAPI, &nodeInfo.NetworkID, &parents, "blowball", string(i)) id, err := m.ID() Must(err) From 973bfd88cbcf0b2ee845cf1dd1a3407c5aa6ccba Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 22 Mar 2021 17:04:49 +0200 Subject: [PATCH 05/29] remove semi-lazy attack --- go-tools/semi-lazy-attack/README.MD | 3 - go-tools/semi-lazy-attack/semi-lazy-attack.go | 100 ------------------ 2 files changed, 103 deletions(-) delete mode 100644 go-tools/semi-lazy-attack/README.MD delete mode 100644 go-tools/semi-lazy-attack/semi-lazy-attack.go diff --git a/go-tools/semi-lazy-attack/README.MD b/go-tools/semi-lazy-attack/README.MD deleted file mode 100644 index 792440f..0000000 --- a/go-tools/semi-lazy-attack/README.MD +++ /dev/null @@ -1,3 +0,0 @@ -# Semi-Lazy Attack - -Attempts to reference a non-lazy transaction and a transaction on the verge of becoming semi-lazy. Then it should create a tip explosion on top of the newly created message to attract honest messages. Attempting to turn honest transactions to semi-lazy ones. \ No newline at end of file diff --git a/go-tools/semi-lazy-attack/semi-lazy-attack.go b/go-tools/semi-lazy-attack/semi-lazy-attack.go deleted file mode 100644 index 63bd9cb..0000000 --- a/go-tools/semi-lazy-attack/semi-lazy-attack.go +++ /dev/null @@ -1,100 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "github.com/eclipse/paho.mqtt.golang" - . "github.com/iotaledger/chrysalis-tools/go-tests/lib" - iota "github.com/iotaledger/iota.go/v2" - "golang.org/x/crypto/blake2b" -) - -const semLazyExplosionSize = 10 - -var nodeApi *iota.NodeAPIClient -var msQueue []uint32 -var info *iota.NodeInfoResponse - -func main() { - endpoint := flag.String("endpoint", "http://localhost:14265", "endpoint") - nodeApi = iota.NewNodeAPIClient(*endpoint) - var err error - info, err = nodeApi.Info() - Must(err) - - fmt.Println("Listening..") - client := SetUpMqTT("http://localhost", 1883, nil, nil, nil) - sub(client) - select {} -} - -func sub(client mqtt.Client) (mqtt.Token, mqtt.Token) { - messageToken := client.Subscribe("messages", 1, censor) - milestoneToken := client.Subscribe("milestones/solid", 1, rcvMilestone) - - messageToken.Wait() - milestoneToken.Wait() - - //currently milestone is not important - return messageToken, milestoneToken -} - -func rcvMilestone(client mqtt.Client, msg mqtt.Message) { - milestone := iota.Milestone{} - err := milestone.UnmarshalJSON(msg.Payload()) - Must(err) - if len(msQueue) >= 15 { - msQueue = msQueue[1:] - } - msQueue = append(msQueue, milestone.Index) - fmt.Println("add ms index ", milestone.Index) -} - -func censor(client mqtt.Client, msg mqtt.Message) { - fmt.Println("start censoring") - msgId := getMessageId(msg) - semLazyMs := getSemLazyMs() - vergeOfBecomingSemLazyMsg := send_sem_lazy(msgId, semLazyMs, -1) - for i := 0; i < semLazyExplosionSize; i++ { - id, err := vergeOfBecomingSemLazyMsg.ID() - Must(err) - stitch(*id, getLatestMsId(), i) - } -} - -func getLatestMsId() iota.MessageID { - info, err := nodeApi.Info() - Must(err) - ms, err := nodeApi.MilestoneByIndex(info.LatestMilestoneIndex) - Must(err) - msgId, err := iota.MessageIDFromHexString(ms.MessageID) - Must(err) - return msgId -} - -func send_sem_lazy(id iota.MessageID, ms iota.MessageID, num int) *iota.Message { - fmt.Println("sending a tx on the verge of being semi-lazy") - parents := iota.RemoveDupsAndSortByLexicalOrderArrayOf32Bytes(iota.MessageIDs{id, ms}) - return SendDataMessage(nodeApi, &info.NetworkID, &parents, "semlazy", string(num)) -} - -func stitch(id iota.MessageID, ms iota.MessageID, stichnum int) *iota.Message { - fmt.Println("sending a stitch") - parents := iota.RemoveDupsAndSortByLexicalOrderArrayOf32Bytes(iota.MessageIDs{id, ms}) - return SendDataMessage(nodeApi, &info.NetworkID, &parents, "censor stitch", string(stichnum)) -} - -func getSemLazyMs() iota.MessageID { - info, err := nodeApi.Info() - Must(err) - solidMilestoneIndex := info.ConfirmedMilestoneIndex - msResp, err := nodeApi.MilestoneByIndex(solidMilestoneIndex - 13) - Must(err) - msgId, err := iota.MessageIDFromHexString(msResp.MessageID) - Must(err) - return msgId -} - -func getMessageId(msg mqtt.Message) iota.MessageID { - return blake2b.Sum256(msg.Payload()) -} From 001f7f2d0fe6a769cfddc082c552b47e35d02310 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 22 Mar 2021 17:17:12 +0200 Subject: [PATCH 06/29] fix value conflicts --- go-tools/value conflicts/value_conflicts.go | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/go-tools/value conflicts/value_conflicts.go b/go-tools/value conflicts/value_conflicts.go index c88b1ed..5ea5bb5 100644 --- a/go-tools/value conflicts/value_conflicts.go +++ b/go-tools/value conflicts/value_conflicts.go @@ -2,21 +2,15 @@ package main import ( "flag" - "fmt" . "github.com/iotaledger/chrysalis-tools/go-tests/lib" iota "github.com/iotaledger/iota.go/v2" ) -const ( - nodeUrl = LocalHost - apiPort = ApiPort -) - func main() { - endpoint := flag.String("endpoint", fmt.Sprintf("http://%s:%d", nodeUrl, apiPort), "endpoint") - nodeAPI := iota.NewNodeAPIClient(*endpoint) - info, err := nodeAPI.Info() - Must(err) + nodeDomain, apiPort := DefineNodeFlags() + flag.Parse() + + nodeAPI, nodeInfo := ObtainAPI(*nodeDomain, *apiPort) genesisAddress := iota.Ed25519Address{} genesisOutput := [iota.TransactionIDLength]byte{} @@ -30,18 +24,19 @@ func main() { tx, err := iota.NewTransactionBuilder(). AddInput(CreateInput(&genesisAddress, genesisOutput, 0)). - AddOutput(CreateOutput(&address1, 825)). + AddOutput(CreateOutput(&address1, 1_500_000)). AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). Build(signer) Must(err) - SendValueMessage(nodeAPI, &info.NetworkID, nil, tx) + SendValueMessage(nodeAPI, &nodeInfo.NetworkID, nil, tx) tx, err = iota.NewTransactionBuilder(). AddInput(CreateInput(&genesisAddress, genesisOutput, 0)). - AddOutput(CreateOutput(&address1, 825)). + AddOutput(CreateOutput(&address1, 1_800_000)). AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). Build(signer) Must(err) + SendValueMessage(nodeAPI, &nodeInfo.NetworkID, nil, tx) } From d7aa1359c8d32f90e0bb4e05dd060c7e134ba723 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 22 Mar 2021 17:37:51 +0200 Subject: [PATCH 07/29] remove .iml file --- go-tools/chrysalis-attacks.iml | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 go-tools/chrysalis-attacks.iml diff --git a/go-tools/chrysalis-attacks.iml b/go-tools/chrysalis-attacks.iml deleted file mode 100644 index aad2efc..0000000 --- a/go-tools/chrysalis-attacks.iml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file From 85bcb3e557120daf17a3a860e3657f94b569b315 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 22 Mar 2021 17:38:48 +0200 Subject: [PATCH 08/29] milestone out of order --- .../milestone_out_of_order.go | 73 ++++++++++++------- 1 file changed, 48 insertions(+), 25 deletions(-) diff --git a/go-tools/milestone_out_of_order/milestone_out_of_order.go b/go-tools/milestone_out_of_order/milestone_out_of_order.go index 27a096e..b252af1 100644 --- a/go-tools/milestone_out_of_order/milestone_out_of_order.go +++ b/go-tools/milestone_out_of_order/milestone_out_of_order.go @@ -1,48 +1,68 @@ package main import ( + "encoding/hex" + "flag" . "github.com/iotaledger/chrysalis-tools/go-tests/lib" iota "github.com/iotaledger/iota.go/v2" ed "github.com/iotaledger/iota.go/v2/ed25519" + "log" "time" ) -const ( - nodeUrl = LocalHost - apiPort = ApiPort -) - func main() { - nodeAPI, info := ObtainAPI(nodeUrl, apiPort) + nodeDomain, apiPort := DefineNodeFlags() + flag.Parse() - //TODO specify correct genesis address and output - genesisAddress := iota.Ed25519Address{} - genesisOutput := [iota.TransactionIDLength]byte{} + nodeAPI, nodeInfo := ObtainAPI(*nodeDomain, *apiPort) + nullOutput := [iota.TransactionIDLength]byte{} - seed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) - privateKey, _, address1 := GenerateAddressFromSeed(seed) + inputSeed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) + privateKey, _, address1 := GenerateAddressFromSeed(inputSeed) + log.Println("input ed_address 1 is ", hex.EncodeToString(address1[:])) + log.Println("input bech 32_1 address is ", address1.Bech32(1)) signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ Address: &address1, - Keys: &privateKey, + Keys: privateKey, }) + outputSeed2 := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xe1}) + _, _, address2 := GenerateAddressFromSeed(outputSeed2) + log.Println("input ed_address 2 is ", hex.EncodeToString(address2[:])) + log.Println("input bech 32_2 address is ", address2.Bech32(1)) + + outputSeed3 := CreateSeed([]byte{0xae, 0xad, 0xbe, 0xe1}) + _, _, address3 := GenerateAddressFromSeed(outputSeed3) + log.Println("input ed_address 3 is ", hex.EncodeToString(address3[:])) + log.Println("input bech 32_3 address is ", address3.Bech32(1)) tx, err := iota.NewTransactionBuilder(). - AddInput(CreateInput(&genesisAddress, genesisOutput, 0)). - AddOutput(CreateOutput(&address1, 825)). + AddInput(CreateInput(&address1, nullOutput, 0)). + AddOutput(CreateOutput(&address2, 1000005000000061-10_000_000)). + AddOutput(CreateOutput(&address3, 10_000_000)). AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). Build(signer) Must(err) - message1 := SendValueMessage(nodeAPI, &info.NetworkID, &iota.MessageIDs{iota.MessageID{}}, tx) + milestoneResponse, err := nodeAPI.MilestoneByIndex(nodeInfo.LatestMilestoneIndex) + Must(err) + + parentBytes, err := hex.DecodeString(milestoneResponse.MessageID) + Must(err) + + var parent iota.MessageID + copy(parent[:], parentBytes) + + message1 := SendValueMessage(nodeAPI, &nodeInfo.NetworkID, &iota.MessageIDs{parent}, tx) - tx, err = iota.NewTransactionBuilder(). - AddInput(CreateInput(&genesisAddress, genesisOutput, 0)). - AddOutput(CreateOutput(&address1, 700)). + tx2, err := iota.NewTransactionBuilder(). + AddInput(CreateInput(&address1, nullOutput, 0)). + AddOutput(CreateOutput(&address2, 1000005000000061-20_000_000)). + AddOutput(CreateOutput(&address3, 20_000_000)). AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). Build(signer) Must(err) - message2 := SendValueMessage(nodeAPI, &info.NetworkID, &iota.MessageIDs{iota.MessageID{}}, tx) + message2 := SendValueMessage(nodeAPI, &nodeInfo.NetworkID, &iota.MessageIDs{parent}, tx2) //**** Set Up Milestone ****/ @@ -52,18 +72,21 @@ func main() { id, err := message2.ID() Must(err) - sendMilestone(id, milestonePublicKey, keyMap, nodeAPI, info) + log.Print("message2 id is ", hex.EncodeToString((*id)[:])) + sendMilestone(id, milestonePublicKey, keyMap, nodeAPI, nodeInfo, nodeInfo.LatestMilestoneIndex+2) - id, err = message1.ID() + id2, err := message1.ID() Must(err) - sendMilestone(id, milestonePublicKey, keyMap, nodeAPI, info) + log.Print("message1 id is ", hex.EncodeToString((*id2)[:])) + sendMilestone(id2, milestonePublicKey, keyMap, nodeAPI, nodeInfo, nodeInfo.LatestMilestoneIndex+1) } -func sendMilestone(id *iota.MessageID, milestonePublicKey iota.MilestonePublicKey, keyMap iota.MilestonePublicKeyMapping, nodeAPI *iota.NodeAPIClient, info *iota.NodeInfoResponse) { - parents := iota.MessageIDs{*id} +func sendMilestone(parent *iota.MessageID, milestonePublicKey iota.MilestonePublicKey, keyMap iota.MilestonePublicKeyMapping, nodeAPI *iota.NodeAPIClient, info *iota.NodeInfoResponse, index uint32) { + parents := iota.MessageIDs{*parent} proof := CreateMilestoneInclusionMerkleProof(parents) - milestone := CreateSignedMilestone(2, uint64(time.Now().Unix()), parents, proof, []iota.MilestonePublicKey{milestonePublicKey}, + log.Print("The merkle root is ", hex.EncodeToString(proof[:])) + milestone := CreateSignedMilestone(index, uint64(time.Now().Unix()), parents, proof, []iota.MilestonePublicKey{milestonePublicKey}, nil, keyMap) SendMilestone(nodeAPI, &info.NetworkID, parents, milestone) } From bfed474c284a2a36b304775016d0d50f6461c9a7 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 22 Mar 2021 17:39:56 +0200 Subject: [PATCH 09/29] use log in blowball --- go-tools/blowballs/blowballs.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go-tools/blowballs/blowballs.go b/go-tools/blowballs/blowballs.go index 6ba3d19..4df7fe7 100644 --- a/go-tools/blowballs/blowballs.go +++ b/go-tools/blowballs/blowballs.go @@ -3,9 +3,9 @@ package main import ( "encoding/hex" "flag" - "fmt" . "github.com/iotaledger/chrysalis-tools/go-tests/lib" iota "github.com/iotaledger/iota.go/v2" + "log" ) func main() { @@ -27,7 +27,7 @@ func main() { m := SendDataMessage(nodeAPI, &nodeInfo.NetworkID, &parents, "blowball", string(i)) id, err := m.ID() Must(err) - fmt.Println("sent blowball message ", hex.EncodeToString(id[:])) + log.Println("sent blowball message ", hex.EncodeToString(id[:])) } } From 89be46fb0dda7031b164ac936d4b288dccccd493 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 22 Mar 2021 17:41:08 +0200 Subject: [PATCH 10/29] delete dup Must --- go-tools/honest spam/honest.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/go-tools/honest spam/honest.go b/go-tools/honest spam/honest.go index 27ca2ff..9fc9813 100644 --- a/go-tools/honest spam/honest.go +++ b/go-tools/honest spam/honest.go @@ -30,8 +30,6 @@ func main() { info, err := nodeAPI.Info() Must(err) - Must(err) - var i uint32 = 0 for { i++ From 09f10e427196b193616216f718352f98072de9b7 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 22 Mar 2021 17:43:08 +0200 Subject: [PATCH 11/29] rename go-tests --- {go-tools => go-tests}/README.MD | 0 {go-tools => go-tests}/blowballs/blowballs.go | 0 {go-tools => go-tests}/go.mod | 0 go-tests/go.sum | 173 ++++++++++++++++++ {go-tools => go-tests}/honest spam/README.MD | 0 {go-tools => go-tests}/honest spam/honest.go | 0 {go-tools => go-tests}/lib/lib.go | 0 {go-tools => go-tests}/lib/merkle_hasher.go | 0 {go-tools => go-tests}/lib/milestone.go | 0 .../milestone_out_of_order/README.MD | 0 .../milestone_out_of_order.go | 0 .../value conflicts/value_conflicts.go | 0 12 files changed, 173 insertions(+) rename {go-tools => go-tests}/README.MD (100%) rename {go-tools => go-tests}/blowballs/blowballs.go (100%) rename {go-tools => go-tests}/go.mod (100%) create mode 100644 go-tests/go.sum rename {go-tools => go-tests}/honest spam/README.MD (100%) rename {go-tools => go-tests}/honest spam/honest.go (100%) rename {go-tools => go-tests}/lib/lib.go (100%) rename {go-tools => go-tests}/lib/merkle_hasher.go (100%) rename {go-tools => go-tests}/lib/milestone.go (100%) rename {go-tools => go-tests}/milestone_out_of_order/README.MD (100%) rename {go-tools => go-tests}/milestone_out_of_order/milestone_out_of_order.go (100%) rename {go-tools => go-tests}/value conflicts/value_conflicts.go (100%) diff --git a/go-tools/README.MD b/go-tests/README.MD similarity index 100% rename from go-tools/README.MD rename to go-tests/README.MD diff --git a/go-tools/blowballs/blowballs.go b/go-tests/blowballs/blowballs.go similarity index 100% rename from go-tools/blowballs/blowballs.go rename to go-tests/blowballs/blowballs.go diff --git a/go-tools/go.mod b/go-tests/go.mod similarity index 100% rename from go-tools/go.mod rename to go-tests/go.mod diff --git a/go-tests/go.sum b/go-tests/go.sum new file mode 100644 index 0000000..669a6db --- /dev/null +++ b/go-tests/go.sum @@ -0,0 +1,173 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +filippo.io/edwards25519 v1.0.0-beta.2 h1:/BZRNzm8N4K4eWfK28dL4yescorxtO7YG1yun8fy+pI= +filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/dgraph-io/badger v1.5.4/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= +github.com/dgryski/go-farm v0.0.0-20190323231341-8198c7b169ec/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/eclipse/paho.mqtt.golang v1.3.2 h1:ICzfxSyrR8bOsh9l8JBBOwO1tc2C26oEyody0ml0L6E= +github.com/eclipse/paho.mqtt.golang v1.3.2/go.mod h1:eTzb4gxwwyWpqBUHGQZ4ABAV7+Jgm1PklsYT/eo8Hcc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= +github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iotaledger/iota.go v1.0.0-beta.15.0.20210212090247-51c40bcebea7 h1:DIVriS1iEEOPrYwQ/vpHLsnVtmUpj4S+2UI4Jl+48ZQ= +github.com/iotaledger/iota.go v1.0.0-beta.15.0.20210212090247-51c40bcebea7/go.mod h1:RiKYwDyY7aCD1L0YRzHSjOsJ5mUR9yvQpvhZncNcGQI= +github.com/iotaledger/iota.go/v2 v2.0.0-20210309092402-a4a03ab62bd2 h1:MRwfPn1o2ZAbQxlc+6xvW+ayXAKUXw3GXJwT7b6pUJI= +github.com/iotaledger/iota.go/v2 v2.0.0-20210309092402-a4a03ab62bd2/go.mod h1:W6ma7/TCwGO9s3+OX9c0AES4vc4/3PhoDuROXFUBqRE= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32 h1:W6apQkHrMkS0Muv8G/TipAy/FJl/rCYT0+EuS8+Z0z4= +github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.4 h1:NiTx7EEvBzu9sFOD1zORteLSt3o8gnlvZZwSE9TnY9U= +github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +go.mongodb.org/mongo-driver v1.0.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.1 h1:DGeFlSan2f+WEtCERJ4J9GJWk15TxUi8QGagfI87Xyc= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +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/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/h2non/gock.v1 v1.0.14/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= +gopkg.in/h2non/gock.v1 v1.0.15 h1:SzLqcIlb/fDfg7UvukMpNcWsu7sI5tWwL+KCATZqks0= +gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/go-tools/honest spam/README.MD b/go-tests/honest spam/README.MD similarity index 100% rename from go-tools/honest spam/README.MD rename to go-tests/honest spam/README.MD diff --git a/go-tools/honest spam/honest.go b/go-tests/honest spam/honest.go similarity index 100% rename from go-tools/honest spam/honest.go rename to go-tests/honest spam/honest.go diff --git a/go-tools/lib/lib.go b/go-tests/lib/lib.go similarity index 100% rename from go-tools/lib/lib.go rename to go-tests/lib/lib.go diff --git a/go-tools/lib/merkle_hasher.go b/go-tests/lib/merkle_hasher.go similarity index 100% rename from go-tools/lib/merkle_hasher.go rename to go-tests/lib/merkle_hasher.go diff --git a/go-tools/lib/milestone.go b/go-tests/lib/milestone.go similarity index 100% rename from go-tools/lib/milestone.go rename to go-tests/lib/milestone.go diff --git a/go-tools/milestone_out_of_order/README.MD b/go-tests/milestone_out_of_order/README.MD similarity index 100% rename from go-tools/milestone_out_of_order/README.MD rename to go-tests/milestone_out_of_order/README.MD diff --git a/go-tools/milestone_out_of_order/milestone_out_of_order.go b/go-tests/milestone_out_of_order/milestone_out_of_order.go similarity index 100% rename from go-tools/milestone_out_of_order/milestone_out_of_order.go rename to go-tests/milestone_out_of_order/milestone_out_of_order.go diff --git a/go-tools/value conflicts/value_conflicts.go b/go-tests/value conflicts/value_conflicts.go similarity index 100% rename from go-tools/value conflicts/value_conflicts.go rename to go-tests/value conflicts/value_conflicts.go From d533c4b1b48d13290c4c9a896c1ce20bce386e0c Mon Sep 17 00:00:00 2001 From: galrogo Date: Thu, 25 Mar 2021 10:27:26 +0200 Subject: [PATCH 12/29] milestone merkle proof fix --- go-tests/lib/milestone.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/go-tests/lib/milestone.go b/go-tests/lib/milestone.go index c9ed11c..2461195 100644 --- a/go-tests/lib/milestone.go +++ b/go-tests/lib/milestone.go @@ -61,16 +61,14 @@ func CreateMilestoneInclusionMerkleProof(msgIds MessageIDs) MilestoneInclusionMe hasher := NewHasher(crypto.BLAKE2b_256) marshalers := make([]encoding.BinaryMarshaler, len(msgIds)) for i, msgId := range msgIds { - var marshId MarshableID + var marshId = make(MarshableID, 32) copy(marshId, msgId[:]) marshalers[i] = marshId } hash, err := hasher.Hash(marshalers) Must(err) proof := MilestoneInclusionMerkleProof{} - for i, b := range hash { - proof[i] = b - } + copy(proof[:], hash) return proof } From 058419afe9202faec2c4dea42051a0e2bd01b51c Mon Sep 17 00:00:00 2001 From: galrogo Date: Thu, 25 Mar 2021 10:41:30 +0200 Subject: [PATCH 13/29] same index milestone --- go-tests/same_index_milestone/README.MD | 4 + go-tests/same_index_milestone/same_index.go | 92 +++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 go-tests/same_index_milestone/README.MD create mode 100644 go-tests/same_index_milestone/same_index.go diff --git a/go-tests/same_index_milestone/README.MD b/go-tests/same_index_milestone/README.MD new file mode 100644 index 0000000..c6f4b3e --- /dev/null +++ b/go-tests/same_index_milestone/README.MD @@ -0,0 +1,4 @@ +# Same index milestone generation + +Creates two milestones with the same index and send them to the node. +Attempts to mimick situations that can happen in private nets or testnets. diff --git a/go-tests/same_index_milestone/same_index.go b/go-tests/same_index_milestone/same_index.go new file mode 100644 index 0000000..fb282d8 --- /dev/null +++ b/go-tests/same_index_milestone/same_index.go @@ -0,0 +1,92 @@ +package main + +import ( +"encoding/hex" +"flag" +. "github.com/iotaledger/chrysalis-tools/go-tests/lib" +iota "github.com/iotaledger/iota.go/v2" +ed "github.com/iotaledger/iota.go/v2/ed25519" +"log" +"time" +) + + +func main() { + nodeDomain, apiPort := DefineNodeFlags() + flag.Parse() + + nodeAPI, nodeInfo := ObtainAPI(*nodeDomain, *apiPort) + nullOutput := [iota.TransactionIDLength]byte{} + + inputSeed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) + privateKey, _, address1 := GenerateAddressFromSeed(inputSeed) + log.Println("input ed_address 1 is ", hex.EncodeToString(address1[:])) + log.Println("input bech 32_1 address is ", address1.Bech32(1)) + signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ + Address: &address1, + Keys: privateKey, + }) + + outputSeed2 := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xe1}) + _, _, address2 := GenerateAddressFromSeed(outputSeed2) + log.Println("input ed_address 2 is ", hex.EncodeToString(address2[:])) + log.Println("input bech 32_2 address is ", address2.Bech32(1)) + + outputSeed3 := CreateSeed([]byte{0xae, 0xad, 0xbe, 0xe1}) + _, _, address3 := GenerateAddressFromSeed(outputSeed3) + log.Println("input ed_address 3 is ", hex.EncodeToString(address3[:])) + log.Println("input bech 32_3 address is ", address3.Bech32(1)) + tx, err := iota.NewTransactionBuilder(). + AddInput(CreateInput(&address1, nullOutput, 0)). + AddOutput(CreateOutput(&address2, 1000005000000061-10_000_000)). + AddOutput(CreateOutput(&address3, 10_000_000)). + AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). + Build(signer) + Must(err) + + milestoneResponse, err := nodeAPI.MilestoneByIndex(nodeInfo.LatestMilestoneIndex) + Must(err) + + parentBytes, err := hex.DecodeString(milestoneResponse.MessageID) + Must(err) + + var parent iota.MessageID + copy(parent[:], parentBytes) + + message1 := SendValueMessage(nodeAPI, &nodeInfo.NetworkID, &iota.MessageIDs{parent}, tx) + + tx2, err := iota.NewTransactionBuilder(). + AddInput(CreateInput(&address1, nullOutput, 0)). + AddOutput(CreateOutput(&address2, 1000005000000061-20_000_000)). + AddOutput(CreateOutput(&address3, 20_000_000)). + AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). + Build(signer) + Must(err) + + message2 := SendValueMessage(nodeAPI, &nodeInfo.NetworkID, &iota.MessageIDs{parent}, tx2) + + //**** Set Up Milestone ****/ + + milestoneSeed := CreateSeed([]byte{0xef, 0x13, 0xab, 0xed}) + privateKey, milestonePublicKey := GenerateMilestoneKeys(milestoneSeed) + keyMap := CreateMilestoneKeyMapping([]ed.PrivateKey{privateKey}, []iota.MilestonePublicKey{milestonePublicKey}) + + id, err := message2.ID() + Must(err) + log.Print("message2 id is ", hex.EncodeToString((*id)[:])) + sendMilestone(id, milestonePublicKey, keyMap, nodeAPI, nodeInfo, nodeInfo.LatestMilestoneIndex+1) + + id2, err := message1.ID() + Must(err) + log.Print("message1 id is ", hex.EncodeToString((*id2)[:])) + sendMilestone(id2, milestonePublicKey, keyMap, nodeAPI, nodeInfo, nodeInfo.LatestMilestoneIndex+1) +} + +func sendMilestone(parent *iota.MessageID, milestonePublicKey iota.MilestonePublicKey, keyMap iota.MilestonePublicKeyMapping, nodeAPI *iota.NodeAPIClient, info *iota.NodeInfoResponse, index uint32) { + parents := iota.MessageIDs{*parent} + proof := CreateMilestoneInclusionMerkleProof(parents) + log.Print("The merkle root is ", hex.EncodeToString(proof[:])) + milestone := CreateSignedMilestone(index, uint64(time.Now().Unix()), parents, proof, []iota.MilestonePublicKey{milestonePublicKey}, + nil, keyMap) + SendMilestone(nodeAPI, &info.NetworkID, parents, milestone) +} From e48c9da6b8b53c17377efe55672f96354bf749e5 Mon Sep 17 00:00:00 2001 From: galrogo Date: Thu, 1 Apr 2021 10:19:47 +0300 Subject: [PATCH 14/29] print message for milestone id --- go-tests/same_index_milestone/same_index.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/go-tests/same_index_milestone/same_index.go b/go-tests/same_index_milestone/same_index.go index fb282d8..7388f65 100644 --- a/go-tests/same_index_milestone/same_index.go +++ b/go-tests/same_index_milestone/same_index.go @@ -88,5 +88,8 @@ func sendMilestone(parent *iota.MessageID, milestonePublicKey iota.MilestonePubl log.Print("The merkle root is ", hex.EncodeToString(proof[:])) milestone := CreateSignedMilestone(index, uint64(time.Now().Unix()), parents, proof, []iota.MilestonePublicKey{milestonePublicKey}, nil, keyMap) - SendMilestone(nodeAPI, &info.NetworkID, parents, milestone) + message := SendMilestone(nodeAPI, &info.NetworkID, parents, milestone) + id, err := message.ID() + Must(err) + log.Print("sent milestone ", hex.EncodeToString(id[:])) } From 201b6bd77eb026adc0750618b0dd0a6ed0b93095 Mon Sep 17 00:00:00 2001 From: galrogo Date: Sun, 4 Apr 2021 22:36:41 +0300 Subject: [PATCH 15/29] add genesis output to lib --- go-tests/lib/lib.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/go-tests/lib/lib.go b/go-tests/lib/lib.go index 6f3216e..f412663 100644 --- a/go-tests/lib/lib.go +++ b/go-tests/lib/lib.go @@ -15,6 +15,10 @@ const ( LocalHost = "127.0.0.1" ) +var ( + GenesisOutput = [TransactionIDLength]byte{} +) + func Must(err error) { if err != nil { panic(err) @@ -23,7 +27,7 @@ func Must(err error) { func DefineNodeFlags() (*string, *int) { nodeDomain := flag.String("node", LocalHost, "Can be either domain name or ip of the node") - blowballSize :=flag.Int("port", ApiPort, "Api port") + blowballSize := flag.Int("port", ApiPort, "Api port") return nodeDomain, blowballSize } From ef5cf064f07899727757500edb9cf3b4d1dbbeaf Mon Sep 17 00:00:00 2001 From: galrogo Date: Sun, 4 Apr 2021 22:37:39 +0300 Subject: [PATCH 16/29] add script that splits funds --- go-tests/split_outputs/split.go | 55 +++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 go-tests/split_outputs/split.go diff --git a/go-tests/split_outputs/split.go b/go-tests/split_outputs/split.go new file mode 100644 index 0000000..ef2c786 --- /dev/null +++ b/go-tests/split_outputs/split.go @@ -0,0 +1,55 @@ +package main + +import ( + "encoding/binary" + "encoding/hex" + "flag" + . "github.com/iotaledger/chrysalis-tools/go-tests/lib" + iota "github.com/iotaledger/iota.go/v2" + "github.com/iotaledger/iota.go/v2/bech32" + "log" +) + +func main() { + nodeDomain, apiPort := DefineNodeFlags() + amount := flag.Uint64("amount", 7_936_447_619_000, "How much iotas should be split to each output") + flag.Parse() + + nodeAPI, nodeInfo := ObtainAPI(*nodeDomain, *apiPort) + + seed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) + privateKey, _, address1 := GenerateAddressFromSeed(seed) + signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ + Address: &address1, + Keys: privateKey, + }) + txBuilder := iota.NewTransactionBuilder(). + AddInput(CreateInput(&address1, GenesisOutput, 0)). + AddIndexationPayload(&iota.Indexation{Index: []byte("split"), Data: []byte("126")}) + + for i := 1; i < 127; i++ { + buf := make([]byte, 4) + binary.PutUvarint(buf, uint64(i)) + seed = CreateSeed(buf) + _, _, address := GenerateAddressFromSeed(seed) + txBuilder.AddOutput(CreateOutput(&address, *amount)) + } + + var last_bal uint64 = 1_000_005_000_000_061 - (*amount * 126) + buf := make([]byte, 4) + binary.PutUvarint(buf, uint64(127)) + seed = CreateSeed(buf) + _, _, address := GenerateAddressFromSeed(seed) + tx, err := txBuilder.AddOutput(CreateOutput(&address, last_bal)). + Build(signer) + Must(err) + + SendValueMessage(nodeAPI, &nodeInfo.NetworkID, nil, tx) + bech, err := bech32.Encode("atoi", address[:]) + Must(err) + log.Println(" last address is ", hex.EncodeToString(address[:]), " ", bech) + log.Println("Last remainder balance is ", last_bal) + transactionID, err := tx.ID() + Must(err) + log.Println("tx has is ", hex.EncodeToString(transactionID[:])) +} From 368e627ccb184e253dc794241ffdafd93cede1fe Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 5 Apr 2021 00:29:29 +0300 Subject: [PATCH 17/29] use custom updated iota.go that doesn't fail on output balance checks --- go-tests/go.mod | 4 ++-- go-tests/lib/lib.go | 25 ++++++++++++------------- go-tests/split_outputs/split.go | 4 ++-- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/go-tests/go.mod b/go-tests/go.mod index ba2db50..bd9e2b4 100644 --- a/go-tests/go.mod +++ b/go-tests/go.mod @@ -3,9 +3,9 @@ module github.com/iotaledger/chrysalis-tools/go-tests go 1.15 require ( + github.com/GalRogozinski/iota.go/v2 v2.0.0-20210404211100-0aa2ecb6e13b github.com/eclipse/paho.mqtt.golang v1.3.2 - github.com/iotaledger/iota.go/v2 v2.0.0-20210309092402-a4a03ab62bd2 github.com/kr/pretty v0.1.0 // indirect - golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a + golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect ) diff --git a/go-tests/lib/lib.go b/go-tests/lib/lib.go index f412663..5f6a3b2 100644 --- a/go-tests/lib/lib.go +++ b/go-tests/lib/lib.go @@ -1,12 +1,11 @@ package lib import ( - "encoding/hex" "flag" "fmt" + . "github.com/GalRogozinski/iota.go/v2" + ed "github.com/GalRogozinski/iota.go/v2/ed25519" mqtt "github.com/eclipse/paho.mqtt.golang" - . "github.com/iotaledger/iota.go/v2" - ed "github.com/iotaledger/iota.go/v2/ed25519" ) const ( @@ -32,9 +31,9 @@ func DefineNodeFlags() (*string, *int) { return nodeDomain, blowballSize } -func ObtainAPI(nodeUrl string, apiPort int) (*NodeAPIClient, *NodeInfoResponse) { +func ObtainAPI(nodeUrl string, apiPort int) (*NodeHTTPAPIClient, *NodeInfoResponse) { endpoint := fmt.Sprintf("http://%s:%d", nodeUrl, apiPort) - nodeAPI := NewNodeAPIClient(endpoint) + nodeAPI := NewNodeHTTPAPIClient(endpoint) info, err := nodeAPI.Info() Must(err) return nodeAPI, info @@ -74,7 +73,7 @@ func SetUpMqTT(broker string, port uint, messagePubHandler func(client mqtt.Clie return client } -func SendDataMessage(api *NodeAPIClient, networkId *string, parents *MessageIDs, index string, data string) *Message { +func SendDataMessage(api *NodeHTTPAPIClient, networkId *string, parents *MessageIDs, index string, data string) *Message { m := CreateDataMessage(api, networkId, parents, index, data) message, err := api.SubmitMessage(m) @@ -82,7 +81,7 @@ func SendDataMessage(api *NodeAPIClient, networkId *string, parents *MessageIDs, return message } -func CreateDataMessage(api *NodeAPIClient, networkId *string, parents *MessageIDs, index string, data string) *Message { +func CreateDataMessage(api *NodeHTTPAPIClient, networkId *string, parents *MessageIDs, index string, data string) *Message { m := &Message{} m.NetworkID = NetworkIDFromString(*networkId) m.Payload = &Indexation{Index: []byte(index), Data: []byte(data)} @@ -90,14 +89,14 @@ func CreateDataMessage(api *NodeAPIClient, networkId *string, parents *MessageID return m } -func SendValueMessage(api *NodeAPIClient, networkId *string, parents *MessageIDs, tx *Transaction) *Message { +func SendValueMessage(api *NodeHTTPAPIClient, networkId *string, parents *MessageIDs, tx *Transaction) *Message { m := CreateValueMessage(api, networkId, parents, tx) message, err := api.SubmitMessage(m) Must(err) return message } -func CreateValueMessage(api *NodeAPIClient, networkId *string, parents *MessageIDs, tx *Transaction) *Message { +func CreateValueMessage(api *NodeHTTPAPIClient, networkId *string, parents *MessageIDs, tx *Transaction) *Message { m := &Message{} m.NetworkID = NetworkIDFromString(*networkId) m.Payload = tx @@ -105,17 +104,17 @@ func CreateValueMessage(api *NodeAPIClient, networkId *string, parents *MessageI return m } -func getParentsIfNil(api *NodeAPIClient, parents *MessageIDs) *MessageIDs { +func getParentsIfNil(api *NodeHTTPAPIClient, parents *MessageIDs) *MessageIDs { if parents == nil { tipsResponse, err := api.Tips() Must(err) - tips := tipsResponse.Tips + tips, err := tipsResponse.Tips() + Must(err) parents = &MessageIDs{} for _, tip := range tips { - decodeString, err := hex.DecodeString(tip) Must(err) var parent MessageID - copy(parent[:], decodeString[:]) + copy(parent[:], tip[:]) *parents = append(*parents, parent) } diff --git a/go-tests/split_outputs/split.go b/go-tests/split_outputs/split.go index ef2c786..2fcf00f 100644 --- a/go-tests/split_outputs/split.go +++ b/go-tests/split_outputs/split.go @@ -4,9 +4,9 @@ import ( "encoding/binary" "encoding/hex" "flag" + iota "github.com/GalRogozinski/iota.go/v2" + "github.com/GalRogozinski/iota.go/v2/bech32" . "github.com/iotaledger/chrysalis-tools/go-tests/lib" - iota "github.com/iotaledger/iota.go/v2" - "github.com/iotaledger/iota.go/v2/bech32" "log" ) From 82f05c7b957ce395d4d9fff58cf884cd8ce036b3 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 5 Apr 2021 00:30:00 +0300 Subject: [PATCH 18/29] overflow attack --- go-tests/overflow/overflow.go | 56 +++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 go-tests/overflow/overflow.go diff --git a/go-tests/overflow/overflow.go b/go-tests/overflow/overflow.go new file mode 100644 index 0000000..6ae5cbd --- /dev/null +++ b/go-tests/overflow/overflow.go @@ -0,0 +1,56 @@ +package main + +import ( + "encoding/binary" + "encoding/hex" + "flag" + iota "github.com/GalRogozinski/iota.go/v2" + . "github.com/iotaledger/chrysalis-tools/go-tests/lib" + "log" + "math" +) + +func main() { + nodeDomain, apiPort := DefineNodeFlags() + flag.Parse() + + nodeAPI, nodeInfo := ObtainAPI(*nodeDomain, *apiPort) + + buf := make([]byte, 4) + binary.PutUvarint(buf, uint64(127)) + seed := CreateSeed(buf) + privateKey, _, address1 := GenerateAddressFromSeed(seed) + signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ + Address: &address1, + Keys: privateKey, + }) + + balanceResponse, err := nodeAPI.BalanceByEd25519Address(&address1) + Must(err) + outputResponse, err := nodeAPI.OutputIDsByEd25519Address(&address1, false) + Must(err) + outputId := outputResponse.OutputIDs[0] + idHex := outputId[:iota.TransactionIDLength*2] + txIdSlice, err := hex.DecodeString(string(idHex)) + var txId [32]byte + copy(txId[:], txIdSlice) + Must(err) + index := outputId[iota.TransactionIDLength*2:] + outputIndexBytes, err := hex.DecodeString(string(index)) + outputIndex := binary.LittleEndian.Uint16(outputIndexBytes) + Must(err) + + outputSeed2 := CreateSeed([]byte{0xce, 0xad, 0xbe, 0xe1}) + _, _, address2 := GenerateAddressFromSeed(outputSeed2) + + tx, err := iota.NewTransactionBuilder(). + AddInput(CreateInput(&address1, txId, outputIndex)). + AddIndexationPayload(&iota.Indexation{Index: []byte("overflow"), Data: []byte("127")}). + AddOutput(CreateOutput(&address1, math.MaxUint64)). + AddOutput(CreateOutput(&address2, balanceResponse.Balance)). + Build(signer) + Must(err) + + SendValueMessage(nodeAPI, &nodeInfo.NetworkID, nil, tx) + log.Println(" addresses are ", hex.EncodeToString(address1[:]), " ", hex.EncodeToString(address2[:])) +} From e746a42f6f0eb4082495694a98ac1d2dbcbe81a2 Mon Sep 17 00:00:00 2001 From: galrogo Date: Mon, 5 Apr 2021 01:10:53 +0300 Subject: [PATCH 19/29] fix to work with updated lib --- go-tests/go.mod | 2 +- go-tests/honest spam/honest.go | 4 ++-- go-tests/lib/merkle_hasher.go | 2 +- go-tests/lib/milestone.go | 6 ++--- .../milestone_out_of_order.go | 12 +++++----- go-tests/same_index_milestone/same_index.go | 23 +++++++++---------- go-tests/value conflicts/value_conflicts.go | 4 ++-- 7 files changed, 26 insertions(+), 27 deletions(-) diff --git a/go-tests/go.mod b/go-tests/go.mod index bd9e2b4..60705f1 100644 --- a/go-tests/go.mod +++ b/go-tests/go.mod @@ -3,7 +3,7 @@ module github.com/iotaledger/chrysalis-tools/go-tests go 1.15 require ( - github.com/GalRogozinski/iota.go/v2 v2.0.0-20210404211100-0aa2ecb6e13b + github.com/GalRogozinski/iota.go/v2 v2.0.0-20210404215123-2cd5660ffe29 github.com/eclipse/paho.mqtt.golang v1.3.2 github.com/kr/pretty v0.1.0 // indirect golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect diff --git a/go-tests/honest spam/honest.go b/go-tests/honest spam/honest.go index 9fc9813..e39924e 100644 --- a/go-tests/honest spam/honest.go +++ b/go-tests/honest spam/honest.go @@ -5,9 +5,9 @@ import ( "encoding/json" "flag" "fmt" + iota "github.com/GalRogozinski/iota.go/v2" "github.com/eclipse/paho.mqtt.golang" . "github.com/iotaledger/chrysalis-tools/go-tests/lib" - iota "github.com/iotaledger/iota.go/v2" "log" ) @@ -25,7 +25,7 @@ const ( func main() { endpoint := flag.String("endpoint", fmt.Sprintf("http://%s:%d", nodeUrl, apiPort), "endpoint") - nodeAPI := iota.NewNodeAPIClient(*endpoint) + nodeAPI := iota.NewNodeHTTPAPIClient(*endpoint) client := SetUpMqTT(nodeUrl, mqttPort, nil, nil, nil) info, err := nodeAPI.Info() Must(err) diff --git a/go-tests/lib/merkle_hasher.go b/go-tests/lib/merkle_hasher.go index 2d2baa1..bbeabdd 100644 --- a/go-tests/lib/merkle_hasher.go +++ b/go-tests/lib/merkle_hasher.go @@ -6,7 +6,7 @@ import ( "crypto" "encoding" "encoding/hex" - iotago "github.com/iotaledger/iota.go/v2" + iotago "github.com/GalRogozinski/iota.go/v2" "math/bits" ) diff --git a/go-tests/lib/milestone.go b/go-tests/lib/milestone.go index 2461195..122434f 100644 --- a/go-tests/lib/milestone.go +++ b/go-tests/lib/milestone.go @@ -4,8 +4,8 @@ import ( "crypto" "encoding" "encoding/hex" - . "github.com/iotaledger/iota.go/v2" - ed "github.com/iotaledger/iota.go/v2/ed25519" + . "github.com/GalRogozinski/iota.go/v2" + ed "github.com/GalRogozinski/iota.go/v2/ed25519" ) const ( @@ -17,7 +17,7 @@ var ( MilestoneSeed = []byte{0xef, 0x13, 0xab, 0xed} ) -func SendMilestone(api *NodeAPIClient, networkId *string, parents MessageIDs, milestone Milestone) *Message { +func SendMilestone(api *NodeHTTPAPIClient, networkId *string, parents MessageIDs, milestone Milestone) *Message { message := CreateMilestoneMessage(networkId, parents, milestone) msg, err := api.SubmitMessage(message) Must(err) diff --git a/go-tests/milestone_out_of_order/milestone_out_of_order.go b/go-tests/milestone_out_of_order/milestone_out_of_order.go index b252af1..b46e8a3 100644 --- a/go-tests/milestone_out_of_order/milestone_out_of_order.go +++ b/go-tests/milestone_out_of_order/milestone_out_of_order.go @@ -3,9 +3,9 @@ package main import ( "encoding/hex" "flag" + iota "github.com/GalRogozinski/iota.go/v2" + ed "github.com/GalRogozinski/iota.go/v2/ed25519" . "github.com/iotaledger/chrysalis-tools/go-tests/lib" - iota "github.com/iotaledger/iota.go/v2" - ed "github.com/iotaledger/iota.go/v2/ed25519" "log" "time" ) @@ -20,7 +20,7 @@ func main() { inputSeed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) privateKey, _, address1 := GenerateAddressFromSeed(inputSeed) log.Println("input ed_address 1 is ", hex.EncodeToString(address1[:])) - log.Println("input bech 32_1 address is ", address1.Bech32(1)) + log.Println("input bech 32_1 address is ", address1.Bech32(iota.PrefixTestnet)) signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ Address: &address1, Keys: privateKey, @@ -29,12 +29,12 @@ func main() { outputSeed2 := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xe1}) _, _, address2 := GenerateAddressFromSeed(outputSeed2) log.Println("input ed_address 2 is ", hex.EncodeToString(address2[:])) - log.Println("input bech 32_2 address is ", address2.Bech32(1)) + log.Println("input bech 32_2 address is ", address2.Bech32(iota.PrefixTestnet)) outputSeed3 := CreateSeed([]byte{0xae, 0xad, 0xbe, 0xe1}) _, _, address3 := GenerateAddressFromSeed(outputSeed3) log.Println("input ed_address 3 is ", hex.EncodeToString(address3[:])) - log.Println("input bech 32_3 address is ", address3.Bech32(1)) + log.Println("input bech 32_3 address is ", address3.Bech32(iota.PrefixTestnet)) tx, err := iota.NewTransactionBuilder(). AddInput(CreateInput(&address1, nullOutput, 0)). AddOutput(CreateOutput(&address2, 1000005000000061-10_000_000)). @@ -82,7 +82,7 @@ func main() { } -func sendMilestone(parent *iota.MessageID, milestonePublicKey iota.MilestonePublicKey, keyMap iota.MilestonePublicKeyMapping, nodeAPI *iota.NodeAPIClient, info *iota.NodeInfoResponse, index uint32) { +func sendMilestone(parent *iota.MessageID, milestonePublicKey iota.MilestonePublicKey, keyMap iota.MilestonePublicKeyMapping, nodeAPI *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, index uint32) { parents := iota.MessageIDs{*parent} proof := CreateMilestoneInclusionMerkleProof(parents) log.Print("The merkle root is ", hex.EncodeToString(proof[:])) diff --git a/go-tests/same_index_milestone/same_index.go b/go-tests/same_index_milestone/same_index.go index 7388f65..e50d0d5 100644 --- a/go-tests/same_index_milestone/same_index.go +++ b/go-tests/same_index_milestone/same_index.go @@ -1,16 +1,15 @@ package main import ( -"encoding/hex" -"flag" -. "github.com/iotaledger/chrysalis-tools/go-tests/lib" -iota "github.com/iotaledger/iota.go/v2" -ed "github.com/iotaledger/iota.go/v2/ed25519" -"log" -"time" + "encoding/hex" + "flag" + iota "github.com/GalRogozinski/iota.go/v2" + ed "github.com/GalRogozinski/iota.go/v2/ed25519" + . "github.com/iotaledger/chrysalis-tools/go-tests/lib" + "log" + "time" ) - func main() { nodeDomain, apiPort := DefineNodeFlags() flag.Parse() @@ -21,7 +20,7 @@ func main() { inputSeed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) privateKey, _, address1 := GenerateAddressFromSeed(inputSeed) log.Println("input ed_address 1 is ", hex.EncodeToString(address1[:])) - log.Println("input bech 32_1 address is ", address1.Bech32(1)) + log.Println("input bech 32_1 address is ", address1.Bech32(iota.PrefixTestnet)) signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ Address: &address1, Keys: privateKey, @@ -30,12 +29,12 @@ func main() { outputSeed2 := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xe1}) _, _, address2 := GenerateAddressFromSeed(outputSeed2) log.Println("input ed_address 2 is ", hex.EncodeToString(address2[:])) - log.Println("input bech 32_2 address is ", address2.Bech32(1)) + log.Println("input bech 32_2 address is ", address2.Bech32(iota.PrefixTestnet)) outputSeed3 := CreateSeed([]byte{0xae, 0xad, 0xbe, 0xe1}) _, _, address3 := GenerateAddressFromSeed(outputSeed3) log.Println("input ed_address 3 is ", hex.EncodeToString(address3[:])) - log.Println("input bech 32_3 address is ", address3.Bech32(1)) + log.Println("input bech 32_3 address is ", address3.Bech32(iota.PrefixTestnet)) tx, err := iota.NewTransactionBuilder(). AddInput(CreateInput(&address1, nullOutput, 0)). AddOutput(CreateOutput(&address2, 1000005000000061-10_000_000)). @@ -82,7 +81,7 @@ func main() { sendMilestone(id2, milestonePublicKey, keyMap, nodeAPI, nodeInfo, nodeInfo.LatestMilestoneIndex+1) } -func sendMilestone(parent *iota.MessageID, milestonePublicKey iota.MilestonePublicKey, keyMap iota.MilestonePublicKeyMapping, nodeAPI *iota.NodeAPIClient, info *iota.NodeInfoResponse, index uint32) { +func sendMilestone(parent *iota.MessageID, milestonePublicKey iota.MilestonePublicKey, keyMap iota.MilestonePublicKeyMapping, nodeAPI *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, index uint32) { parents := iota.MessageIDs{*parent} proof := CreateMilestoneInclusionMerkleProof(parents) log.Print("The merkle root is ", hex.EncodeToString(proof[:])) diff --git a/go-tests/value conflicts/value_conflicts.go b/go-tests/value conflicts/value_conflicts.go index 5ea5bb5..b9dc0a4 100644 --- a/go-tests/value conflicts/value_conflicts.go +++ b/go-tests/value conflicts/value_conflicts.go @@ -2,8 +2,8 @@ package main import ( "flag" + iota "github.com/GalRogozinski/iota.go/v2" . "github.com/iotaledger/chrysalis-tools/go-tests/lib" - iota "github.com/iotaledger/iota.go/v2" ) func main() { @@ -33,7 +33,7 @@ func main() { tx, err = iota.NewTransactionBuilder(). AddInput(CreateInput(&genesisAddress, genesisOutput, 0)). - AddOutput(CreateOutput(&address1, 1_800_000)). + AddOutput(CreateOutput(&address1, 1_800_000)). AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). Build(signer) Must(err) From ffd9cca522d84acc6514170a0fbe600cd64197af Mon Sep 17 00:00:00 2001 From: galrogo Date: Thu, 22 Apr 2021 15:39:32 +0300 Subject: [PATCH 20/29] improve split funds --- go-tests/lib/lib.go | 26 ++++++++++++++++++++++++++ go-tests/split_outputs/split.go | 16 +++++++++------- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/go-tests/lib/lib.go b/go-tests/lib/lib.go index 5f6a3b2..f10e543 100644 --- a/go-tests/lib/lib.go +++ b/go-tests/lib/lib.go @@ -1,6 +1,7 @@ package lib import ( + "encoding/binary" "flag" "fmt" . "github.com/GalRogozinski/iota.go/v2" @@ -14,6 +15,15 @@ const ( LocalHost = "127.0.0.1" ) +/** +private key, public key, and address +*/ +type KeyTriplet struct { + Sk ed.PrivateKey + Pk ed.PublicKey + Address Ed25519Address +} + var ( GenesisOutput = [TransactionIDLength]byte{} ) @@ -167,3 +177,19 @@ func GenerateAddressFromSeed(seed []byte) (ed.PrivateKey, ed.PublicKey, Ed25519A address := AddressFromEd25519PubKey(publicKey) return privateKey, publicKey, address } + +/** +Returns lists of keys and addresses +*/ +func GenerateKeyChain(chainLength int, buf_offset int) (keyTriplets []KeyTriplet) { + var chain []KeyTriplet + + for i := 1; i <= chainLength; i++ { + buf := make([]byte, 4) + binary.PutUvarint(buf, uint64(i+buf_offset)) + seed := CreateSeed(buf) + sk, pk, address := GenerateAddressFromSeed(seed) + chain = append(chain, KeyTriplet{sk, pk, address}) + } + return chain +} diff --git a/go-tests/split_outputs/split.go b/go-tests/split_outputs/split.go index 2fcf00f..9b62a1f 100644 --- a/go-tests/split_outputs/split.go +++ b/go-tests/split_outputs/split.go @@ -14,9 +14,12 @@ func main() { nodeDomain, apiPort := DefineNodeFlags() amount := flag.Uint64("amount", 7_936_447_619_000, "How much iotas should be split to each output") flag.Parse() - nodeAPI, nodeInfo := ObtainAPI(*nodeDomain, *apiPort) + SplitFunds(nodeAPI, nodeInfo, amount) +} + +func SplitFunds(nodeAPI *iota.NodeHTTPAPIClient, nodeInfo *iota.NodeInfoResponse, amount *uint64) []KeyTriplet { seed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) privateKey, _, address1 := GenerateAddressFromSeed(seed) signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ @@ -27,12 +30,9 @@ func main() { AddInput(CreateInput(&address1, GenesisOutput, 0)). AddIndexationPayload(&iota.Indexation{Index: []byte("split"), Data: []byte("126")}) - for i := 1; i < 127; i++ { - buf := make([]byte, 4) - binary.PutUvarint(buf, uint64(i)) - seed = CreateSeed(buf) - _, _, address := GenerateAddressFromSeed(seed) - txBuilder.AddOutput(CreateOutput(&address, *amount)) + keyTriplets := GenerateKeyChain(126, 0) + for i := 0; i < len(keyTriplets); i++ { + txBuilder.AddOutput(CreateOutput(&keyTriplets[i].Address, *amount)) } var last_bal uint64 = 1_000_005_000_000_061 - (*amount * 126) @@ -52,4 +52,6 @@ func main() { transactionID, err := tx.ID() Must(err) log.Println("tx has is ", hex.EncodeToString(transactionID[:])) + + return keyTriplets } From edb11c8b078dd22dd5c4a0f2a3f3f0bd3acb78e9 Mon Sep 17 00:00:00 2001 From: galrogo Date: Sun, 25 Apr 2021 17:48:02 +0300 Subject: [PATCH 21/29] circular spam --- go-tests/blowballs/blowballs.go | 2 +- go-tests/circularspam/circularspam.go | 265 ++++++++++++++++++ go-tests/go.mod | 1 - go-tests/go.sum | 7 +- .../{honest spam => honest_spam}/README.MD | 0 .../{honest spam => honest_spam}/honest.go | 0 go-tests/lib/fund_splitter.go | 46 +++ go-tests/split_outputs/split.go | 41 --- .../value_conflicts.go | 0 9 files changed, 314 insertions(+), 48 deletions(-) create mode 100644 go-tests/circularspam/circularspam.go rename go-tests/{honest spam => honest_spam}/README.MD (100%) rename go-tests/{honest spam => honest_spam}/honest.go (100%) create mode 100644 go-tests/lib/fund_splitter.go rename go-tests/{value conflicts => value_conflicts}/value_conflicts.go (100%) diff --git a/go-tests/blowballs/blowballs.go b/go-tests/blowballs/blowballs.go index 4df7fe7..faa5dc0 100644 --- a/go-tests/blowballs/blowballs.go +++ b/go-tests/blowballs/blowballs.go @@ -3,8 +3,8 @@ package main import ( "encoding/hex" "flag" + iota "github.com/GalRogozinski/iota.go/v2" . "github.com/iotaledger/chrysalis-tools/go-tests/lib" - iota "github.com/iotaledger/iota.go/v2" "log" ) diff --git a/go-tests/circularspam/circularspam.go b/go-tests/circularspam/circularspam.go new file mode 100644 index 0000000..43e2f72 --- /dev/null +++ b/go-tests/circularspam/circularspam.go @@ -0,0 +1,265 @@ +package main + +import ( + "encoding/hex" + "flag" + iota "github.com/GalRogozinski/iota.go/v2" + . "github.com/iotaledger/chrysalis-tools/go-tests/lib" + "log" + "math/rand" + "sync" +) + +type futInput = struct { + Address iota.Ed25519Address + amount uint64 +} + +func main() { + nodeDomain, apiPort := DefineNodeFlags() + amount := flag.Uint64("amount", 7_936_447_619_000, "How much iotas should be split to each output") + flag.Parse() + nodeAPI, nodeInfo := ObtainAPI(*nodeDomain, *apiPort) + + keyTriplets := SplitFunds(nodeAPI, nodeInfo, amount) + signer := CreateSigner(keyTriplets) + + tripMap := make(map[string]struct{}) + for _, trip := range keyTriplets { + tripMap[trip.Address.Bech32("atoi")] = struct{}{} + } + + if len(tripMap) != len(keyTriplets) { + log.Println("different lengths") + } else { + log.Println("same length ", len(tripMap)) + } + + wg := new(sync.WaitGroup) + wg.Add(1) + go conflictingSpam(nodeAPI, nodeInfo, keyTriplets, signer) + go circularSpam(nodeAPI, nodeInfo, keyTriplets, signer) + go outOfOrderSpam(nodeAPI, nodeInfo, keyTriplets, signer) + go invalidSpam(nodeAPI, nodeInfo, keyTriplets, signer) + wg.Wait() +} + +func invalidSpam(api *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, triplets []KeyTriplet, signer iota.AddressSigner) { + //for each address + for i := 0; i < len(triplets); i++ { + txBuilder := iota.NewTransactionBuilder() + //query outputs in address + addr := &triplets[i].Address + outputResp, _, err := api.OutputsByEd25519Address(addr, false) + tripletCopy := make([]KeyTriplet, len(triplets)) + copy(tripletCopy, triplets) + tripletCopy = append(tripletCopy[:i], tripletCopy[i+1:]...) + Must(err) + //transfer outputs to a different address + for j, outputId := range outputResp.OutputIDs { + txBuilder = sendAndResetBuilder(api, info, j, txBuilder, signer, "Sending out invalid spam ") + outputByID, err := api.OutputByID(outputId.MustAsUTXOInput().ID()) + Must(err) + txId, err := outputByID.TxID() + Must(err) + txBuilder.AddInput(CreateInput(addr, *txId, outputByID.OutputIndex)) + amount := rand.Intn(4236899) + change := rand.Intn(amount) + var targetAddress iota.Ed25519Address + targetAddress, tripletCopy = randAddress(tripletCopy) + txBuilder.AddOutput(CreateOutput(&targetAddress, uint64(amount-change))) + var targetAddress2 iota.Ed25519Address + targetAddress2, tripletCopy = randAddress(tripletCopy) + txBuilder.AddOutput(CreateOutput(&targetAddress2, uint64(change))) + } + sendTransaction(api, info, txBuilder, signer, "Sending out invalid spam ") + } + + go invalidSpam(api, info, triplets, signer) +} + +func sendAndResetBuilder(api *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, i int, txBuilder *iota.TransactionBuilder, signer iota.AddressSigner, logMsg string) *iota.TransactionBuilder { + if i != 0 && i%125 == 0 { + sendTransaction(api, info, txBuilder, signer, logMsg) + txBuilder = iota.NewTransactionBuilder() + } + return txBuilder +} + +func sendTransaction(api *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, txBuilder *iota.TransactionBuilder, signer iota.AddressSigner, logMsg string) { + tx, err := txBuilder.Build(signer) + Must(err) + message := SendValueMessage(api, &info.NetworkID, nil, tx) + id := message.MustID() + log.Println(logMsg, hex.EncodeToString(id[:])) +} + +func randAddress(tripletCopy []KeyTriplet) (iota.Ed25519Address, []KeyTriplet) { + randIndex := rand.Intn(len(tripletCopy)) + targetAddress := tripletCopy[randIndex].Address + tripletCopy = append(tripletCopy[:randIndex], tripletCopy[randIndex+1:]...) + log.Printf("target address %s index %d", targetAddress.Bech32("atoi"), randIndex) + return targetAddress, tripletCopy +} + +func outOfOrderSpam(api *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, triplets []KeyTriplet, signer iota.AddressSigner) { + size := len(triplets) + + var futureIn []futInput + //for each address + for i := 0; i < size; i++ { + //query outputs in address + addr := &triplets[i].Address + tripletCopy := make([]KeyTriplet, len(triplets)) + copy(tripletCopy, triplets) + tripletCopy = append(tripletCopy[:i], tripletCopy[i+1:]...) + outputResp, _, err := api.OutputsByEd25519Address(addr, false) + Must(err) + txBuilder := iota.NewTransactionBuilder() + //transfer outputs to a different address + var changeAccumulator uint64 = 0 + for i, outputId := range outputResp.OutputIDs { + if i == 125 { + break + } + outputByID, err := api.OutputByID(outputId.MustAsUTXOInput().ID()) + Must(err) + output, err := outputByID.Output() + Must(err) + txId, err := outputByID.TxID() + Must(err) + txBuilder.AddInput(CreateInput(addr, *txId, outputByID.OutputIndex)) + var targetAddress iota.Ed25519Address + targetAddress, tripletCopy = randAddress(tripletCopy) + amount, err := output.Deposit() + Must(err) + change := amount - uint64(rand.Int63n(int64(amount))) + txBuilder.AddOutput(CreateOutput(&targetAddress, amount-change)) + futureIn = append(futureIn, futInput{Address: targetAddress, amount: amount - change}) + changeAccumulator += change + } + tx, err := txBuilder.AddOutput(CreateOutput(addr, changeAccumulator)). + Build(signer) + Must(err) + + tripletCopy = make([]KeyTriplet, len(triplets)) + copy(tripletCopy, triplets) + txBuilder = iota.NewTransactionBuilder() + for index, input := range futureIn { + if index == 125 { + break + } + log.Print("triplet copy len is ", len(tripletCopy)) + id, err := tx.ID() + Must(err) + var targetAddress iota.Ed25519Address + targetAddress, tripletCopy = randAddress(tripletCopy) + txBuilder.AddInput(CreateInput(&input.Address, *id, uint16(index))). + AddOutput(CreateOutput(&targetAddress, input.amount)) + } + tx2, err := txBuilder.Build(signer) + Must(err) + message2 := SendValueMessage(api, &info.NetworkID, nil, tx2) + id2 := message2.MustID() + message1 := SendValueMessage(api, &info.NetworkID, &iota.MessageIDs{id2}, tx) + id1 := message1.MustID() + log.Println("Sending out of order spam ", hex.EncodeToString(id1[:]), " ", hex.EncodeToString(id2[:])) + } + + go outOfOrderSpam(api, info, triplets, signer) +} + +func CreateSigner(triplets []KeyTriplet) iota.AddressSigner { + var keys []iota.AddressKeys + for i := 0; i < len(triplets); i++ { + addressKeys := iota.AddressKeys{ + Address: &triplets[i].Address, + Keys: triplets[i].Sk, + } + keys = append(keys, addressKeys) + } + return iota.NewInMemoryAddressSigner(keys...) +} + +func circularSpam(api *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, triplets []KeyTriplet, signer iota.AddressSigner) { + size := len(triplets) + //for each address + for i := 0; i < size; i++ { + txBuilder := iota.NewTransactionBuilder() + //query outputs in address + addr := triplets[i].Address + outputResp, _, err := api.OutputsByEd25519Address(&addr, false) + tripletsCopy := make([]KeyTriplet, size) + copy(tripletsCopy, triplets) + tripletsCopy = append(tripletsCopy[:i], tripletsCopy[i+1:]...) + Must(err) + //transfer outputs to a different address + randomTx(api, outputResp, txBuilder, addr, tripletsCopy) + tx, err := txBuilder.Build(signer) + Must(err) + message := SendValueMessage(api, &info.NetworkID, nil, tx) + id := message.MustID() + log.Println("circular spam message sent ", hex.EncodeToString(id[:])) + } + + go circularSpam(api, info, triplets, signer) +} + +func conflictingSpam(api *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, triplets []KeyTriplet, signer iota.AddressSigner) { + //for each address + for i := 0; i < len(triplets); i++ { + tripletsCopy := make([]KeyTriplet, len(triplets)) + //query outputs in address + addr := triplets[i].Address + log.Printf("main address %s index %d", addr.Bech32("atoi"), i) + outputResp, _, err := api.OutputsByEd25519Address(&addr, false) + copied := copy(tripletsCopy, triplets) + log.Printf("%d elements copied", copied) + tripletsCopy = append(tripletsCopy[:i], tripletsCopy[i+1:]...) + Must(err) + + //transfer outputs to a different address + txBuilder := iota.NewTransactionBuilder() + randomTx(api, outputResp, txBuilder, addr, tripletsCopy) + tx, err := txBuilder.Build(signer) + Must(err) + message := SendValueMessage(api, &info.NetworkID, nil, tx) + id := message.MustID() + + txBuilder = iota.NewTransactionBuilder() + randomTx(api, outputResp, txBuilder, addr, tripletsCopy) + tx, err = txBuilder.Build(signer) + Must(err) + message2 := SendValueMessage(api, &info.NetworkID, nil, tx) + id2 := message2.MustID() + log.Println("conflicting messages sent ", hex.EncodeToString(id[:]), " ", hex.EncodeToString(id2[:])) + } + + go conflictingSpam(api, info, triplets, signer) +} + +func randomTx(api *iota.NodeHTTPAPIClient, outputResp *iota.AddressOutputsResponse, txBuilder *iota.TransactionBuilder, addr iota.Ed25519Address, triplets []KeyTriplet) { + var changeAggregator uint64 = 0 + + tripletCopy := make([]KeyTriplet, len(triplets)) + copy(tripletCopy, triplets) + for _, outputId := range outputResp.OutputIDs { + outputByID, err := api.OutputByID(outputId.MustAsUTXOInput().ID()) + Must(err) + output, err := outputByID.Output() + Must(err) + txId, err := outputByID.TxID() + Must(err) + txBuilder.AddInput(CreateInput(&addr, *txId, outputByID.OutputIndex)) + var targetAddress iota.Ed25519Address + targetAddress, tripletCopy = randAddress(tripletCopy) + copyAddress := targetAddress + + amount, err := output.Deposit() + Must(err) + change := amount - uint64(rand.Int63n(int64(amount))) + txBuilder.AddOutput(CreateOutput(©Address, amount-change)) + changeAggregator += change + } + txBuilder.AddOutput(CreateOutput(&addr, changeAggregator)) +} diff --git a/go-tests/go.mod b/go-tests/go.mod index 60705f1..9cf9feb 100644 --- a/go-tests/go.mod +++ b/go-tests/go.mod @@ -6,6 +6,5 @@ require ( github.com/GalRogozinski/iota.go/v2 v2.0.0-20210404215123-2cd5660ffe29 github.com/eclipse/paho.mqtt.golang v1.3.2 github.com/kr/pretty v0.1.0 // indirect - golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect ) diff --git a/go-tests/go.sum b/go-tests/go.sum index 669a6db..2871597 100644 --- a/go-tests/go.sum +++ b/go-tests/go.sum @@ -3,6 +3,8 @@ filippo.io/edwards25519 v1.0.0-beta.2 h1:/BZRNzm8N4K4eWfK28dL4yescorxtO7YG1yun8f filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/GalRogozinski/iota.go/v2 v2.0.0-20210404215123-2cd5660ffe29 h1:nkaVGJ/orzuaBDdSGVAb2KyWTEHb7Pz8IHc08FRFIdM= +github.com/GalRogozinski/iota.go/v2 v2.0.0-20210404215123-2cd5660ffe29/go.mod h1:WfIfmDQnHQ/Y4MLeiDVPpKhGD+oeLSFUc/wrukVKT9o= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -37,7 +39,6 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -45,7 +46,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -54,8 +54,6 @@ github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplb github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iotaledger/iota.go v1.0.0-beta.15.0.20210212090247-51c40bcebea7 h1:DIVriS1iEEOPrYwQ/vpHLsnVtmUpj4S+2UI4Jl+48ZQ= github.com/iotaledger/iota.go v1.0.0-beta.15.0.20210212090247-51c40bcebea7/go.mod h1:RiKYwDyY7aCD1L0YRzHSjOsJ5mUR9yvQpvhZncNcGQI= -github.com/iotaledger/iota.go/v2 v2.0.0-20210309092402-a4a03ab62bd2 h1:MRwfPn1o2ZAbQxlc+6xvW+ayXAKUXw3GXJwT7b6pUJI= -github.com/iotaledger/iota.go/v2 v2.0.0-20210309092402-a4a03ab62bd2/go.mod h1:W6ma7/TCwGO9s3+OX9c0AES4vc4/3PhoDuROXFUBqRE= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -154,7 +152,6 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -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/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/go-tests/honest spam/README.MD b/go-tests/honest_spam/README.MD similarity index 100% rename from go-tests/honest spam/README.MD rename to go-tests/honest_spam/README.MD diff --git a/go-tests/honest spam/honest.go b/go-tests/honest_spam/honest.go similarity index 100% rename from go-tests/honest spam/honest.go rename to go-tests/honest_spam/honest.go diff --git a/go-tests/lib/fund_splitter.go b/go-tests/lib/fund_splitter.go new file mode 100644 index 0000000..66229f7 --- /dev/null +++ b/go-tests/lib/fund_splitter.go @@ -0,0 +1,46 @@ +package lib + +import ( + "encoding/binary" + "encoding/hex" + iota "github.com/GalRogozinski/iota.go/v2" + "github.com/GalRogozinski/iota.go/v2/bech32" + "log" +) + +func SplitFunds(nodeAPI *iota.NodeHTTPAPIClient, nodeInfo *iota.NodeInfoResponse, amount *uint64) []KeyTriplet { + seed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) + privateKey, _, address1 := GenerateAddressFromSeed(seed) + signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ + Address: &address1, + Keys: privateKey, + }) + txBuilder := iota.NewTransactionBuilder(). + AddInput(CreateInput(&address1, GenesisOutput, 0)). + AddIndexationPayload(&iota.Indexation{Index: []byte("split"), Data: []byte("126")}) + + keyTriplets := GenerateKeyChain(126, 0) + for i := 0; i < len(keyTriplets); i++ { + txBuilder.AddOutput(CreateOutput(&keyTriplets[i].Address, *amount)) + } + + var last_bal uint64 = 1_000_005_000_000_061 - (*amount * 126) + buf := make([]byte, 4) + binary.PutUvarint(buf, uint64(127)) + seed = CreateSeed(buf) + _, _, address := GenerateAddressFromSeed(seed) + tx, err := txBuilder.AddOutput(CreateOutput(&address, last_bal)). + Build(signer) + Must(err) + + SendValueMessage(nodeAPI, &nodeInfo.NetworkID, nil, tx) + bech, err := bech32.Encode("atoi", address[:]) + Must(err) + log.Println(" last address is ", hex.EncodeToString(address[:]), " ", bech) + log.Println("Last remainder balance is ", last_bal) + transactionID, err := tx.ID() + Must(err) + log.Println("tx has is ", hex.EncodeToString(transactionID[:])) + + return keyTriplets +} diff --git a/go-tests/split_outputs/split.go b/go-tests/split_outputs/split.go index 9b62a1f..b265687 100644 --- a/go-tests/split_outputs/split.go +++ b/go-tests/split_outputs/split.go @@ -1,13 +1,8 @@ package main import ( - "encoding/binary" - "encoding/hex" "flag" - iota "github.com/GalRogozinski/iota.go/v2" - "github.com/GalRogozinski/iota.go/v2/bech32" . "github.com/iotaledger/chrysalis-tools/go-tests/lib" - "log" ) func main() { @@ -19,39 +14,3 @@ func main() { SplitFunds(nodeAPI, nodeInfo, amount) } -func SplitFunds(nodeAPI *iota.NodeHTTPAPIClient, nodeInfo *iota.NodeInfoResponse, amount *uint64) []KeyTriplet { - seed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) - privateKey, _, address1 := GenerateAddressFromSeed(seed) - signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ - Address: &address1, - Keys: privateKey, - }) - txBuilder := iota.NewTransactionBuilder(). - AddInput(CreateInput(&address1, GenesisOutput, 0)). - AddIndexationPayload(&iota.Indexation{Index: []byte("split"), Data: []byte("126")}) - - keyTriplets := GenerateKeyChain(126, 0) - for i := 0; i < len(keyTriplets); i++ { - txBuilder.AddOutput(CreateOutput(&keyTriplets[i].Address, *amount)) - } - - var last_bal uint64 = 1_000_005_000_000_061 - (*amount * 126) - buf := make([]byte, 4) - binary.PutUvarint(buf, uint64(127)) - seed = CreateSeed(buf) - _, _, address := GenerateAddressFromSeed(seed) - tx, err := txBuilder.AddOutput(CreateOutput(&address, last_bal)). - Build(signer) - Must(err) - - SendValueMessage(nodeAPI, &nodeInfo.NetworkID, nil, tx) - bech, err := bech32.Encode("atoi", address[:]) - Must(err) - log.Println(" last address is ", hex.EncodeToString(address[:]), " ", bech) - log.Println("Last remainder balance is ", last_bal) - transactionID, err := tx.ID() - Must(err) - log.Println("tx has is ", hex.EncodeToString(transactionID[:])) - - return keyTriplets -} diff --git a/go-tests/value conflicts/value_conflicts.go b/go-tests/value_conflicts/value_conflicts.go similarity index 100% rename from go-tests/value conflicts/value_conflicts.go rename to go-tests/value_conflicts/value_conflicts.go From c96b0a4ed8b13320b33f030f32cef439d6c8c856 Mon Sep 17 00:00:00 2001 From: galrogo Date: Tue, 27 Apr 2021 23:07:05 +0300 Subject: [PATCH 22/29] reduce loop by 1 to avoid spam --- go-tests/circularspam/circularspam.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go-tests/circularspam/circularspam.go b/go-tests/circularspam/circularspam.go index 43e2f72..d789b49 100644 --- a/go-tests/circularspam/circularspam.go +++ b/go-tests/circularspam/circularspam.go @@ -46,7 +46,7 @@ func main() { func invalidSpam(api *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, triplets []KeyTriplet, signer iota.AddressSigner) { //for each address - for i := 0; i < len(triplets); i++ { + for i := 0; i < len(triplets)-1; i++ { txBuilder := iota.NewTransactionBuilder() //query outputs in address addr := &triplets[i].Address @@ -103,7 +103,7 @@ func randAddress(tripletCopy []KeyTriplet) (iota.Ed25519Address, []KeyTriplet) { } func outOfOrderSpam(api *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, triplets []KeyTriplet, signer iota.AddressSigner) { - size := len(triplets) + size := len(triplets) - 1 var futureIn []futInput //for each address @@ -182,7 +182,7 @@ func CreateSigner(triplets []KeyTriplet) iota.AddressSigner { } func circularSpam(api *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, triplets []KeyTriplet, signer iota.AddressSigner) { - size := len(triplets) + size := len(triplets) - 1 //for each address for i := 0; i < size; i++ { txBuilder := iota.NewTransactionBuilder() @@ -207,7 +207,7 @@ func circularSpam(api *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, trip func conflictingSpam(api *iota.NodeHTTPAPIClient, info *iota.NodeInfoResponse, triplets []KeyTriplet, signer iota.AddressSigner) { //for each address - for i := 0; i < len(triplets); i++ { + for i := 0; i < len(triplets)-1; i++ { tripletsCopy := make([]KeyTriplet, len(triplets)) //query outputs in address addr := triplets[i].Address From b61dcb0bc5e0344cd7977bb328810ecd0102c8bd Mon Sep 17 00:00:00 2001 From: galrogo Date: Wed, 28 Apr 2021 14:27:22 +0300 Subject: [PATCH 23/29] remove address of operator from private key --- go-tests/value_conflicts/value_conflicts.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go-tests/value_conflicts/value_conflicts.go b/go-tests/value_conflicts/value_conflicts.go index b9dc0a4..bcb78b0 100644 --- a/go-tests/value_conflicts/value_conflicts.go +++ b/go-tests/value_conflicts/value_conflicts.go @@ -19,7 +19,7 @@ func main() { privateKey, _, address1 := GenerateAddressFromSeed(seed) signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ Address: &address1, - Keys: &privateKey, + Keys: privateKey, }) tx, err := iota.NewTransactionBuilder(). From d07e4ce359e26df66ed98f98216f9f062c3e9411 Mon Sep 17 00:00:00 2001 From: galrogo Date: Wed, 28 Apr 2021 15:06:09 +0300 Subject: [PATCH 24/29] fix value_conflicts --- go-tests/value_conflicts/value_conflicts.go | 33 +++++++++++++++++---- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/go-tests/value_conflicts/value_conflicts.go b/go-tests/value_conflicts/value_conflicts.go index bcb78b0..27ee702 100644 --- a/go-tests/value_conflicts/value_conflicts.go +++ b/go-tests/value_conflicts/value_conflicts.go @@ -4,6 +4,8 @@ import ( "flag" iota "github.com/GalRogozinski/iota.go/v2" . "github.com/iotaledger/chrysalis-tools/go-tests/lib" + "log" + "time" ) func main() { @@ -12,7 +14,7 @@ func main() { nodeAPI, nodeInfo := ObtainAPI(*nodeDomain, *apiPort) - genesisAddress := iota.Ed25519Address{} + //genesisAddress := iota.Ed25519Address{} genesisOutput := [iota.TransactionIDLength]byte{} seed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) @@ -22,21 +24,42 @@ func main() { Keys: privateKey, }) + seed = CreateSeed([]byte{0xde, 0xad, 0xbe, 0xea}) + _, _, address2 := GenerateAddressFromSeed(seed) + + seed = CreateSeed([]byte{0xae, 0xad, 0xbe, 0xea}) + _, _, address3 := GenerateAddressFromSeed(seed) + + balanceResp, err := nodeAPI.BalanceByEd25519Address(&address1) + Must(err) + amount := balanceResp.Balance + tx, err := iota.NewTransactionBuilder(). - AddInput(CreateInput(&genesisAddress, genesisOutput, 0)). - AddOutput(CreateOutput(&address1, 1_500_000)). + AddInput(CreateInput(&address1, genesisOutput, 0)). + AddOutput(CreateOutput(&address2, amount)). AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). Build(signer) Must(err) SendValueMessage(nodeAPI, &nodeInfo.NetworkID, nil, tx) + log.Println("sent value to ", address2.Bech32("atoi")) tx, err = iota.NewTransactionBuilder(). - AddInput(CreateInput(&genesisAddress, genesisOutput, 0)). - AddOutput(CreateOutput(&address1, 1_800_000)). + AddInput(CreateInput(&address1, genesisOutput, 0)). + AddOutput(CreateOutput(&address3, amount)). AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). Build(signer) Must(err) SendValueMessage(nodeAPI, &nodeInfo.NetworkID, nil, tx) + log.Println("sent value to ", address3.Bech32("atoi")) + + time.Sleep(11 * time.Second) + addressResp, err := nodeAPI.BalanceByEd25519Address(&address2) + Must(err) + log.Printf("balance in %s is %d", address2.Bech32("atoi"), addressResp.Balance) + + addressResp, err = nodeAPI.BalanceByEd25519Address(&address3) + Must(err) + log.Printf("balance in %s is %d", address3.Bech32("atoi"), addressResp.Balance) } From baa24e809a27fef436416ee48b8f4ae1bfc010c9 Mon Sep 17 00:00:00 2001 From: galrogo Date: Wed, 28 Apr 2021 16:50:44 +0300 Subject: [PATCH 25/29] fix honest spammer flags --- go-tests/honest_spam/honest.go | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/go-tests/honest_spam/honest.go b/go-tests/honest_spam/honest.go index e39924e..416e52c 100644 --- a/go-tests/honest_spam/honest.go +++ b/go-tests/honest_spam/honest.go @@ -17,23 +17,19 @@ var ( unconfirmedMessages = make(map[string]struct{}) ) -const ( - nodeUrl = LocalHost - apiPort = ApiPort - mqttPort = MqttPort -) - func main() { - endpoint := flag.String("endpoint", fmt.Sprintf("http://%s:%d", nodeUrl, apiPort), "endpoint") - nodeAPI := iota.NewNodeHTTPAPIClient(*endpoint) - client := SetUpMqTT(nodeUrl, mqttPort, nil, nil, nil) - info, err := nodeAPI.Info() - Must(err) + nodeDomain, apiPort := DefineNodeFlags() + mqttPort := flag.Int("mqtt", MqttPort, "Mqtt port") + flag.Parse() + + nodeAPI, nodeInfo := ObtainAPI(*nodeDomain, *apiPort) + + client := SetUpMqTT(*nodeDomain, uint(*mqttPort), nil, nil, nil) var i uint32 = 0 for { i++ - msg := CreateDataMessage(nodeAPI, &info.NetworkID, nil, "honest", string(i)) + msg := CreateDataMessage(nodeAPI, &nodeInfo.NetworkID, nil, "honest", string(i)) message, err := nodeAPI.SubmitMessage(msg) Must(err) totalMessageCounter++ From 8d01b03e2a45cc9bdb24135a2040b58ca4c762d0 Mon Sep 17 00:00:00 2001 From: galrogo Date: Wed, 28 Apr 2021 17:43:54 +0300 Subject: [PATCH 26/29] add readme --- go-tests/honest_spam/README.MD | 15 ++++++++++++++- go-tests/milestone_out_of_order/README.MD | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/go-tests/honest_spam/README.MD b/go-tests/honest_spam/README.MD index ced512c..d3a6e6a 100644 --- a/go-tests/honest_spam/README.MD +++ b/go-tests/honest_spam/README.MD @@ -1,3 +1,16 @@ #Honest Spam -Sends in data messages using the default api. It keeps track of the confirmation rate via MQTT and prints it. This tool should be used in parallel to other attacks running on the tangle. \ No newline at end of file +Sends in data messages using the default api. It keeps track of the confirmation rate via MQTT and prints it. This tool should be used in parallel to other attacks running on the tangle. + +``` +Usage: +go run honest_spam/honest.go + +flags: + -mqtt int + Mqtt port (default 1883) + -node string + Can be either domain name or ip of the node (default "127.0.0.1") + -port int + Api port (default 14265) +``` \ No newline at end of file diff --git a/go-tests/milestone_out_of_order/README.MD b/go-tests/milestone_out_of_order/README.MD index 54683d6..af47fee 100644 --- a/go-tests/milestone_out_of_order/README.MD +++ b/go-tests/milestone_out_of_order/README.MD @@ -1,3 +1,16 @@ #Milestones out of order -This attack generates milestones with indexes out of order that confirm conflicting value transactions. The point is to imitate a condition where nodes receive milestones out of order. \ No newline at end of file +This attack generates milestones with indexes out of order that confirm conflicting value transactions. The point is to imitate a condition where nodes receive milestones out of order. + +``` +Usage: +go run milestone_out_of_order/milestone_out_of_order.go + +flags: + -mqtt int + Mqtt port (default 1883) + -node string + Can be either domain name or ip of the node (default "127.0.0.1") + -port int + Api port (default 14265) +``` \ No newline at end of file From 0aff183b60b8ccf3fe3827104971e572f540da18 Mon Sep 17 00:00:00 2001 From: galrogo Date: Wed, 28 Apr 2021 17:44:56 +0300 Subject: [PATCH 27/29] transfer to null --- go-tests/null_outputs/README.MD | 15 +++++++ go-tests/null_outputs/transfer_to_null.go | 53 +++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 go-tests/null_outputs/README.MD create mode 100644 go-tests/null_outputs/transfer_to_null.go diff --git a/go-tests/null_outputs/README.MD b/go-tests/null_outputs/README.MD new file mode 100644 index 0000000..798ac28 --- /dev/null +++ b/go-tests/null_outputs/README.MD @@ -0,0 +1,15 @@ +# Null outputs + +Simply tests what happens when we transfer to a null address. +Balance actually transfers but no errors occur + +``` +Usage: +go run null_outputs/transfer_to_null.go + +flags: + -node string + Can be either domain name or ip of the node (default "127.0.0.1") + -port int + Api port (default 14265) +``` \ No newline at end of file diff --git a/go-tests/null_outputs/transfer_to_null.go b/go-tests/null_outputs/transfer_to_null.go new file mode 100644 index 0000000..0ade407 --- /dev/null +++ b/go-tests/null_outputs/transfer_to_null.go @@ -0,0 +1,53 @@ +package main + +import ( + "flag" + iota "github.com/GalRogozinski/iota.go/v2" + . "github.com/iotaledger/chrysalis-tools/go-tests/lib" + "log" + "time" +) + +func main() { + nodeDomain, apiPort := DefineNodeFlags() + flag.Parse() + + nodeAPI, nodeInfo := ObtainAPI(*nodeDomain, *apiPort) + + genesisAddress := iota.Ed25519Address{} + genesisOutput := [iota.TransactionIDLength]byte{} + + //nullPk := ed.PrivateKey(make([]byte, 64)) + + seed := CreateSeed([]byte{0xde, 0xad, 0xbe, 0xef}) + sk, _, address1 := GenerateAddressFromSeed(seed) + log.Printf("address %s", address1.Bech32("atoi")) + + addressBalance, err := nodeAPI.BalanceByEd25519Address(&address1) + Must(err) + log.Printf("balance at genesis address is %d", addressBalance.Balance) + + signer := iota.NewInMemoryAddressSigner(iota.AddressKeys{ + Address: &address1, + Keys: sk, + }) + + tx, err := iota.NewTransactionBuilder(). + AddInput(CreateInput(&address1, genesisOutput, 0)). + AddOutput(CreateOutput(&genesisAddress, addressBalance.Balance)). + AddIndexationPayload(&iota.Indexation{Index: []byte("value"), Data: []byte("test")}). + Build(signer) + Must(err) + + SendValueMessage(nodeAPI, &nodeInfo.NetworkID, nil, tx) + + time.Sleep(time.Second * 10) + addressBalance, err = nodeAPI.BalanceByEd25519Address(&genesisAddress) + Must(err) + log.Printf("balance at genesis address is %d", addressBalance.Balance) + + addressBalance, err = nodeAPI.BalanceByEd25519Address(&address1) + Must(err) + log.Printf("balance at %s address is %d", address1.String(), addressBalance.Balance) + +} From e526f5a6c20f9b882f36bad20114ca4d9560d06b Mon Sep 17 00:00:00 2001 From: galrogo Date: Wed, 28 Apr 2021 18:17:39 +0300 Subject: [PATCH 28/29] more readmes --- go-tests/genesis_snapshot/README.MD | 11 +++++++++++ go-tests/overflow/README.MD | 15 +++++++++++++++ go-tests/same_index_milestone/README.MD | 11 +++++++++++ go-tests/value_conflicts/README.MD | 14 ++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 go-tests/genesis_snapshot/README.MD create mode 100644 go-tests/overflow/README.MD create mode 100644 go-tests/value_conflicts/README.MD diff --git a/go-tests/genesis_snapshot/README.MD b/go-tests/genesis_snapshot/README.MD new file mode 100644 index 0000000..dc979bb --- /dev/null +++ b/go-tests/genesis_snapshot/README.MD @@ -0,0 +1,11 @@ +# Snapshot used for tests + +The following snapshot has been used for the various tests here. +Here are its attributes: + +- NetworkId: *galrocks* +- HRP prefix: atoi +- Hex seed used to generate initial address: `deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef` +- Ed25519 address: `50978713c1c8ae321396ff7fb3a7b17c46c6ec83244c0dcc17ff5a2c7fe0f6b6` +- Address: `atoi1qpgf0pcnc8y2uvsnjmlhlva8k97yd3hvsvjycrwvzll45trlurmtv8zcdr7` +- Balance on address: 1000005000000061 \ No newline at end of file diff --git a/go-tests/overflow/README.MD b/go-tests/overflow/README.MD new file mode 100644 index 0000000..f407925 --- /dev/null +++ b/go-tests/overflow/README.MD @@ -0,0 +1,15 @@ +# Null outputs + +Attempts to overflow the balances. +This fails due to protections in iota.go. + +``` +Usage: +go run overflow/overflow.go + +flags: + -node string + Can be either domain name or ip of the node (default "127.0.0.1") + -port int + Api port (default 14265) +``` \ No newline at end of file diff --git a/go-tests/same_index_milestone/README.MD b/go-tests/same_index_milestone/README.MD index c6f4b3e..f6b8f87 100644 --- a/go-tests/same_index_milestone/README.MD +++ b/go-tests/same_index_milestone/README.MD @@ -2,3 +2,14 @@ Creates two milestones with the same index and send them to the node. Attempts to mimick situations that can happen in private nets or testnets. + +``` +Usage: +go run same_index_milestone/same_index.go + +flags: + -node string + Can be either domain name or ip of the node (default "127.0.0.1") + -port int + Api port (default 14265) +``` \ No newline at end of file diff --git a/go-tests/value_conflicts/README.MD b/go-tests/value_conflicts/README.MD new file mode 100644 index 0000000..629bbf7 --- /dev/null +++ b/go-tests/value_conflicts/README.MD @@ -0,0 +1,14 @@ +# Value Conflicts + +Simply generate a value conflict + +``` +Usage: +go run value_conflicts/value_conflicts.go + +flags: + -node string + Can be either domain name or ip of the node (default "127.0.0.1") + -port int + Api port (default 14265) +``` \ No newline at end of file From 48719e5366922be4528cf0998f6447ec8438cf7f Mon Sep 17 00:00:00 2001 From: galrogo Date: Wed, 28 Apr 2021 18:40:25 +0300 Subject: [PATCH 29/29] add snapshot for tests --- go-tests/genesis_snapshot/export2.bin | Bin 0 -> 230 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 go-tests/genesis_snapshot/export2.bin diff --git a/go-tests/genesis_snapshot/export2.bin b/go-tests/genesis_snapshot/export2.bin new file mode 100644 index 0000000000000000000000000000000000000000..164afcfa48d1dacd0d949a5f91f7856e7ac31394 GIT binary patch literal 230 zcmZQ%=-3dPzyJhJ%<;30u1stMu|a?lLcwV$mmt;hI)SAkh>f5+YA6Vp-Y$Ib#5yD4 lY5(gtFW*?>cI-{FiVyD@@&8de^$)&nvn@JvuD+L<0RXWq97F&B literal 0 HcmV?d00001