From 1e4225398faed960689c604feec642bae10f649b Mon Sep 17 00:00:00 2001 From: ptrus Date: Thu, 19 Mar 2020 13:42:48 +0100 Subject: [PATCH] go/txsource/transfer: inlcude burn transactions in transfer workload --- .changelog/2773.feature.md | 1 + .../cmd/debug/txsource/workload/transfer.go | 122 +++++++++--------- 2 files changed, 65 insertions(+), 58 deletions(-) create mode 100644 .changelog/2773.feature.md diff --git a/.changelog/2773.feature.md b/.changelog/2773.feature.md new file mode 100644 index 00000000000..de191d34363 --- /dev/null +++ b/.changelog/2773.feature.md @@ -0,0 +1 @@ +go/txsource/transfer: inlcude burn transactions in transfer workload diff --git a/go/oasis-node/cmd/debug/txsource/workload/transfer.go b/go/oasis-node/cmd/debug/txsource/workload/transfer.go index 43820845de8..d040341e05d 100644 --- a/go/oasis-node/cmd/debug/txsource/workload/transfer.go +++ b/go/oasis-node/cmd/debug/txsource/workload/transfer.go @@ -19,12 +19,13 @@ import ( const ( // NameTransfer is the name of the transfer workload. + // + // Transfer workload continiously submits transfer and burn transactions. NameTransfer = "transfer" - transferNumAccounts = 10 - transferAmount = 1 - transferFundInterval = 10 - transferGasCost = 10 + transferNumAccounts = 10 + transferAmount = 1 + transferBurnAmount = 10 ) var transferLogger = logging.GetLogger("cmd/txsource/workload/transfer") @@ -60,8 +61,7 @@ func (transfer) Run( // Read all the account info up front. stakingClient := staking.NewStakingClient(conn) for i := range accounts { - fundAmount := transferAmount*transferFundInterval + // funds for `transferFundInterval` transfers - transferGasCost*gasPrice*transferFundInterval // gas costs for `transferFundInterval` transfers + fundAmount := transferAmount // funds for for a transfer if err = transferFunds(ctx, transferLogger, cnsc, fundingAccount, accounts[i].signer.Public(), int64(fundAmount)); err != nil { return fmt.Errorf("workload/transfer: account funding failure: %w", err) } @@ -82,20 +82,10 @@ func (transfer) Run( accounts[i].reckonedBalance = account.General.Balance } - fee := transaction.Fee{ - Gas: transferGasCost, - } - if err = fee.Amount.FromInt64(transferGasCost * gasPrice); err != nil { - return fmt.Errorf("Fee amount error: %w", err) - } - var minBalance quantity.Quantity if err = minBalance.FromInt64(transferAmount); err != nil { return fmt.Errorf("min balance FromInt64 %d: %w", transferAmount, err) } - if err = minBalance.Add(&fee.Amount); err != nil { - return fmt.Errorf("min balance %v Add fee amount %v: %w", minBalance, fee.Amount, err) - } for { perm := rng.Perm(transferNumAccounts) fromPermIdx := 0 @@ -107,54 +97,70 @@ func (transfer) Run( if fromPermIdx >= transferNumAccounts { return fmt.Errorf("all accounts %#v have gone broke", accounts) } - toPermIdx := (fromPermIdx + 1) % transferNumAccounts - from := &accounts[perm[fromPermIdx]] - to := &accounts[perm[toPermIdx]] - transfer := staking.Transfer{ - To: to.signer.Public(), - } - if err = transfer.Tokens.FromInt64(transferAmount); err != nil { - return fmt.Errorf("transfer tokens FromInt64 %d: %w", transferAmount, err) - } - tx := staking.NewTransferTx(from.reckonedNonce, &fee, &transfer) - signedTx, err := transaction.Sign(from.signer, tx) - if err != nil { - return fmt.Errorf("transaction.Sign: %w", err) - } - transferLogger.Debug("submitting transfer", - "from", from.signer.Public(), - "to", to.signer.Public(), - ) - if err = cnsc.SubmitTx(ctx, signedTx); err != nil { - return fmt.Errorf("cnsc.SubmitTx: %w", err) - } - from.reckonedNonce++ - if err = from.reckonedBalance.Sub(&fee.Amount); err != nil { - return fmt.Errorf("from reckoned balance %v Sub fee amount %v: %w", from.reckonedBalance, fee.Amount, err) - } - if err = from.reckonedBalance.Sub(&transfer.Tokens); err != nil { - return fmt.Errorf("from reckoned balance %v Sub transfer tokens %v: %w", from.reckonedBalance, transfer.Tokens, err) - } - if err = to.reckonedBalance.Add(&transfer.Tokens); err != nil { - return fmt.Errorf("to reckoned balance %v Add transfer tokens %v: %w", to.reckonedBalance, transfer.Tokens, err) - } + switch rng.Intn(2) { + case 0: + // do transfer tx. + toPermIdx := (fromPermIdx + 1) % transferNumAccounts + from := &accounts[perm[fromPermIdx]] + to := &accounts[perm[toPermIdx]] + + transfer := staking.Transfer{To: to.signer.Public()} + if err = transfer.Tokens.FromInt64(transferAmount); err != nil { + return fmt.Errorf("transfer tokens FromInt64 %d: %w", transferAmount, err) + } + tx := staking.NewTransferTx(from.reckonedNonce, &transaction.Fee{}, &transfer) + from.reckonedNonce++ - if from.reckonedNonce%transferFundInterval == 0 { - // Re-fund account for next `transferFundInterval` transfers. - fundAmount := transferGasCost * gasPrice * transferFundInterval // gas costs for `transferFundInterval` transfers. - if err = transferFunds(ctx, parallelLogger, cnsc, fundingAccount, from.signer.Public(), int64(fundAmount)); err != nil { - return fmt.Errorf("account funding failure: %w", err) + transferLogger.Debug("Transfering tokens", + "from", from, + "to", to, + "amount", transferAmount, + ) + if err = fundSignAndSubmitTx(ctx, transferLogger, cnsc, from.signer, tx, fundingAccount); err != nil { + transferLogger.Error("failed to sign and submit transfer transaction", + "tx", tx, + "signer", from.signer, + ) + return fmt.Errorf("failed to sign and submit tx: %w", err) } - var fundAmountQ quantity.Quantity - if err = fundAmountQ.FromInt64(int64(fundAmount)); err != nil { - return fmt.Errorf("fundAmountQ FromInt64(%d): %w", fundAmount, err) + + if err = from.reckonedBalance.Sub(&transfer.Tokens); err != nil { + return fmt.Errorf("from reckoned balance %v Sub transfer tokens %v: %w", from.reckonedBalance, transfer.Tokens, err) } - if err = from.reckonedBalance.Add(&fundAmountQ); err != nil { - return fmt.Errorf("to reckoned balance %v Add fund amount %v: %w", to.reckonedBalance, fundAmountQ, err) + if err = to.reckonedBalance.Add(&transfer.Tokens); err != nil { + return fmt.Errorf("to reckoned balance %v Add transfer tokens %v: %w", to.reckonedBalance, transfer.Tokens, err) } - } + case 1: + // do burn tx + from := &accounts[perm[fromPermIdx]] + + // fund account with tokens that will be burned. + if err = transferFunds(ctx, transferLogger, cnsc, fundingAccount, from.signer.Public(), int64(transferBurnAmount)); err != nil { + return fmt.Errorf("workload/transfer: account funding failure: %w", err) + } + + burn := staking.Burn{} + if err = burn.Tokens.FromInt64(transferBurnAmount); err != nil { + return fmt.Errorf("burn tokens FromInt64 %d: %w", transferBurnAmount, err) + } + tx := staking.NewBurnTx(from.reckonedNonce, &transaction.Fee{}, &burn) + from.reckonedNonce++ + transferLogger.Debug("Burning tokens", + "account", from, + "amount", transferBurnAmount, + ) + if err = fundSignAndSubmitTx(ctx, transferLogger, cnsc, from.signer, tx, fundingAccount); err != nil { + transferLogger.Error("failed to sign and submit transfer transaction", + "tx", tx, + "signer", from.signer, + ) + return fmt.Errorf("failed to sign and submit tx: %w", err) + } + default: + return fmt.Errorf("unimplemented") + } select { case <-gracefulExit.Done(): transferLogger.Debug("time's up")