Skip to content
Snippets Groups Projects
double-spend.go 2.06 KiB
Newer Older
package main

import (
	"fmt"
	"net/http"
	"time"

	"github.com/iotaledger/goshimmer/client"
	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address"
	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address/signaturescheme"
	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance"
	valuepayload "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/payload"
	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/transaction"
	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/wallet"
	"github.com/mr-tron/base58"
)

func main() {

	client := client.NewGoShimmerAPI("http://localhost:8080", http.Client{Timeout: 30 * time.Second})

	// genesis wallet
	genesisSeedBytes, err := base58.Decode("7R1itJx5hVuo9w9hjg5cwKFmek4HMSoBDgJZN8hKGxih")
	if err != nil {
		fmt.Println(err)
	}

	const genesisBalance = 1000000000
	genesisWallet := wallet.New(genesisSeedBytes)
	genesisAddr := genesisWallet.Seed().Address(0)
	genesisOutputID := transaction.NewOutputID(genesisAddr, transaction.GenesisID)

	// issue transactions which spend the same genesis output in all partitions
	conflictingTxs := make([]*transaction.Transaction, 2)
	conflictingTxIDs := make([]string, 2)
	receiverSeeds := make([]*wallet.Seed, 2)
	for i := range conflictingTxs {

		// create a new receiver wallet for the given conflict
		receiverSeeds[i] = wallet.NewSeed()
		destAddr := receiverSeeds[i].Address(0)

		tx := transaction.New(
			transaction.NewInputs(genesisOutputID),
			transaction.NewOutputs(map[address.Address][]*balance.Balance{
				destAddr: {
					{Value: genesisBalance, Color: balance.ColorIOTA},
				},
			}))
		tx = tx.Sign(signaturescheme.ED25519(*genesisWallet.Seed().KeyPair(0)))
		conflictingTxs[i] = tx

		valueObject := valuepayload.New(valuepayload.GenesisID, valuepayload.GenesisID, tx)

		// issue the value object
		txID, err := client.SendPayload(valueObject.Bytes())
		if err != nil {
			fmt.Println(err)
		}
		conflictingTxIDs[i] = txID
		fmt.Printf("issued conflict transaction %s\n", txID)
		//time.Sleep(7 * time.Second)
	}
}