From 9940a20f5ab43b53bcedad0c13a82c466e731166 Mon Sep 17 00:00:00 2001 From: anarcher Date: Tue, 20 Nov 2018 14:43:34 +0900 Subject: [PATCH] Add BlockTransaction.Index and BlockOperation.Index --- lib/block/genesis.go | 2 +- lib/block/operation.go | 4 +- lib/block/operation_test.go | 4 +- lib/block/test.go | 4 +- lib/block/transaction.go | 13 +++-- lib/block/transaction_test.go | 50 +++++++++---------- lib/common/constant.go | 3 ++ lib/node/runner/api/base_test.go | 14 +++--- lib/node/runner/api/resource/operation.go | 1 + lib/node/runner/api/resource/resource_test.go | 6 +-- lib/node/runner/api/resource/transaction.go | 1 + lib/node/runner/api/tx_operations_test.go | 6 +-- lib/node/runner/api_block_test.go | 4 +- lib/node/runner/api_transactions_test.go | 4 +- lib/node/runner/block_operations.go | 4 +- lib/node/runner/block_operations_test.go | 6 +-- lib/node/runner/finish_ballot.go | 8 +-- 17 files changed, 73 insertions(+), 61 deletions(-) diff --git a/lib/block/genesis.go b/lib/block/genesis.go index 761c9d84d..a941e57fb 100644 --- a/lib/block/genesis.go +++ b/lib/block/genesis.go @@ -117,7 +117,7 @@ func MakeGenesisBlock(st *storage.LevelDBBackend, genesisAccount BlockAccount, c return } - bt := NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, tx) + bt := NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, tx, 1) // first tx (not proposer tx) if err = bt.Save(st); err != nil { return } diff --git a/lib/block/operation.go b/lib/block/operation.go index c0c97c7fe..7a732ae7d 100644 --- a/lib/block/operation.go +++ b/lib/block/operation.go @@ -29,6 +29,7 @@ type BlockOperation struct { Source string `json:"source"` Body []byte `json:"body"` Height uint64 `json:"block_height"` + Index uint64 `json:"index"` // transaction will be used only for `Save` time. transaction transaction.Transaction @@ -39,7 +40,7 @@ func NewBlockOperationKey(opHash, txHash string) string { return fmt.Sprintf("%s-%s", opHash, txHash) } -func NewBlockOperationFromOperation(op operation.Operation, tx transaction.Transaction, blockHeight uint64) (BlockOperation, error) { +func NewBlockOperationFromOperation(op operation.Operation, tx transaction.Transaction, blockHeight, index uint64) (BlockOperation, error) { body, err := op.B.Serialize() if err != nil { return BlockOperation{}, err @@ -58,6 +59,7 @@ func NewBlockOperationFromOperation(op operation.Operation, tx transaction.Trans Source: tx.B.Source, Body: body, Height: blockHeight, + Index: index, transaction: tx, }, nil diff --git a/lib/block/operation_test.go b/lib/block/operation_test.go index 5ad6ff47c..9995715ea 100644 --- a/lib/block/operation_test.go +++ b/lib/block/operation_test.go @@ -16,7 +16,7 @@ func TestNewBlockOperationFromOperation(t *testing.T) { _, tx := transaction.TestMakeTransaction(conf.NetworkID, 1) op := tx.B.Operations[0] - bo, err := NewBlockOperationFromOperation(op, tx, 0) + bo, err := NewBlockOperationFromOperation(op, tx, 0, 0) require.NoError(t, err) require.Equal(t, bo.Type, op.H.Type) @@ -104,7 +104,7 @@ func TestBlockOperationSaveByTransaction(t *testing.T) { _, tx := transaction.TestMakeTransaction(conf.NetworkID, 10) block := TestMakeNewBlockWithPrevBlock(GetLatestBlock(st), []string{tx.GetHash()}) - bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx) + bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx, 0) err := bt.Save(st) require.NoError(t, err) diff --git a/lib/block/test.go b/lib/block/test.go index 8faabc7d2..90d31b856 100644 --- a/lib/block/test.go +++ b/lib/block/test.go @@ -127,8 +127,8 @@ func TestMakeNewBlockWithPrevBlock(prevBlock Block, txs []string) Block { func TestMakeNewBlockOperation(networkID []byte, n int) (bos []BlockOperation) { _, tx := transaction.TestMakeTransaction(networkID, n) - for _, op := range tx.B.Operations { - bo, err := NewBlockOperationFromOperation(op, tx, 0) + for i, op := range tx.B.Operations { + bo, err := NewBlockOperationFromOperation(op, tx, 0, uint64(i)) if err != nil { panic(err) } diff --git a/lib/block/transaction.go b/lib/block/transaction.go index bbf805848..f90dece67 100644 --- a/lib/block/transaction.go +++ b/lib/block/transaction.go @@ -38,12 +38,14 @@ type BlockTransaction struct { Created string `json:"created"` Message []byte `json:"message"` + Index uint64 `json:"index"` + transaction transaction.Transaction isSaved bool blockHeight uint64 } -func NewBlockTransactionFromTransaction(blockHash string, blockHeight uint64, confirmed string, tx transaction.Transaction) BlockTransaction { +func NewBlockTransactionFromTransaction(blockHash string, blockHeight uint64, confirmed string, tx transaction.Transaction, index uint64) BlockTransaction { var opHashes []string for _, op := range tx.B.Operations { opHashes = append(opHashes, NewBlockOperationKey(op.MakeHashString(), tx.GetHash())) @@ -60,6 +62,7 @@ func NewBlockTransactionFromTransaction(blockHash string, blockHeight uint64, co Amount: tx.TotalAmount(true), Confirmed: confirmed, Created: tx.H.Created, + Index: index, transaction: tx, blockHeight: blockHeight, @@ -189,8 +192,8 @@ func (bt *BlockTransaction) SaveBlockOperations(st *storage.LevelDBBackend) (err } } - for _, op := range bt.Transaction().B.Operations { - if err = bt.SaveBlockOperation(st, op); err != nil { + for i, op := range bt.Transaction().B.Operations { + if err = bt.SaveBlockOperation(st, op, uint64(i)); err != nil { return } } @@ -198,7 +201,7 @@ func (bt *BlockTransaction) SaveBlockOperations(st *storage.LevelDBBackend) (err return nil } -func (bt *BlockTransaction) SaveBlockOperation(st *storage.LevelDBBackend, op operation.Operation) (err error) { +func (bt *BlockTransaction) SaveBlockOperation(st *storage.LevelDBBackend, op operation.Operation, index uint64) (err error) { if bt.blockHeight < 1 { var blk Block if blk, err = GetBlock(st, bt.Block); err != nil { @@ -209,7 +212,7 @@ func (bt *BlockTransaction) SaveBlockOperation(st *storage.LevelDBBackend, op op } var bo BlockOperation - bo, err = NewBlockOperationFromOperation(op, bt.Transaction(), bt.blockHeight) + bo, err = NewBlockOperationFromOperation(op, bt.Transaction(), bt.blockHeight, index) if err != nil { return } diff --git a/lib/block/transaction_test.go b/lib/block/transaction_test.go index 8e6d3c55d..279574e3b 100644 --- a/lib/block/transaction_test.go +++ b/lib/block/transaction_test.go @@ -16,7 +16,7 @@ func TestNewBlockTransaction(t *testing.T) { conf := common.NewTestConfig() _, tx := transaction.TestMakeTransaction(conf.NetworkID, 1) block := TestMakeNewBlock([]string{tx.GetHash()}) - bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx) + bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx, 0) require.Equal(t, bt.Hash, tx.H.Hash) require.Equal(t, bt.SequenceID, tx.B.SequenceID) @@ -39,7 +39,7 @@ func TestBlockTransactionSaveAndGet(t *testing.T) { conf := common.NewTestConfig() st := storage.NewTestStorage() - bt := makeNewBlockTransaction(conf.NetworkID, 1) + bt := makeNewBlockTransaction(conf.NetworkID, 1, 0) err := bt.Save(st) require.NoError(t, err) @@ -60,7 +60,7 @@ func TestBlockTransactionSaveExisting(t *testing.T) { conf := common.NewTestConfig() st := storage.NewTestStorage() - bt := makeNewBlockTransaction(conf.NetworkID, 1) + bt := makeNewBlockTransaction(conf.NetworkID, 1, 0) err := bt.Save(st) require.NoError(t, err) @@ -93,8 +93,8 @@ func TestMultipleBlockTransactionSource(t *testing.T) { } block := TestMakeNewBlock(txHashes) - for _, tx := range txs { - bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx) + for i, tx := range txs { + bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx, uint64(i)) err := bt.Save(st) require.NoError(t, err) } @@ -109,8 +109,8 @@ func TestMultipleBlockTransactionSource(t *testing.T) { } block = TestMakeNewBlock(txHashes) - for _, tx := range txs { - bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx) + for i, tx := range txs { + bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx, uint64(i)) err := bt.Save(st) require.NoError(t, err) } @@ -175,8 +175,8 @@ func TestMultipleBlockTransactionConfirmed(t *testing.T) { } block := TestMakeNewBlock(txHashes) - for _, tx := range txs { - bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx) + for i, tx := range txs { + bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx, uint64(i)) err := bt.Save(st) require.NoError(t, err) } @@ -225,7 +225,7 @@ func TestBlockTransactionMultipleSave(t *testing.T) { conf := common.NewTestConfig() st := storage.NewTestStorage() - bt := makeNewBlockTransaction(conf.NetworkID, 1) + bt := makeNewBlockTransaction(conf.NetworkID, 1, 0) err := bt.Save(st) require.NoError(t, err) @@ -259,7 +259,7 @@ func TestMultipleBlockTransactionGetByAccount(t *testing.T) { blk = TestMakeNewBlock(txHashes) for _, tx := range txs { - bt := NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, tx) + bt := NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, tx, 0) bt.MustSave(st) err := bt.SaveBlockOperations(st) require.NoError(t, err) @@ -278,8 +278,8 @@ func TestMultipleBlockTransactionGetByAccount(t *testing.T) { } blk = TestMakeNewBlock(txHashes) - for _, tx := range txs { - bt := NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, tx) + for i, tx := range txs { + bt := NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, tx, uint64(i)) bt.MustSave(st) err := bt.SaveBlockOperations(st) require.NoError(t, err) @@ -297,8 +297,8 @@ func TestMultipleBlockTransactionGetByAccount(t *testing.T) { } blk = TestMakeNewBlock(txHashes) - for _, tx := range txs { - bt := NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, tx) + for i, tx := range txs { + bt := NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, tx, uint64(i)) bt.MustSave(st) err := bt.SaveBlockOperations(st) require.NoError(t, err) @@ -343,8 +343,8 @@ func TestMultipleBlockTransactionGetByBlock(t *testing.T) { } block0 := TestMakeNewBlock(txHashes0) - for _, tx := range txs0 { - bt := NewBlockTransactionFromTransaction(block0.Hash, block0.Height, block0.ProposedTime, tx) + for i, tx := range txs0 { + bt := NewBlockTransactionFromTransaction(block0.Hash, block0.Height, block0.ProposedTime, tx, uint64(i)) bt.MustSave(st) } @@ -359,8 +359,8 @@ func TestMultipleBlockTransactionGetByBlock(t *testing.T) { } block1 := TestMakeNewBlock(txHashes1) - for _, tx := range txs1 { - bt := NewBlockTransactionFromTransaction(block1.Hash, block1.Height, block1.ProposedTime, tx) + for i, tx := range txs1 { + bt := NewBlockTransactionFromTransaction(block1.Hash, block1.Height, block1.ProposedTime, tx, uint64(i)) bt.MustSave(st) } @@ -427,8 +427,8 @@ func TestMultipleBlockTransactionsOrderByBlockHeightAndCursor(t *testing.T) { block := TestMakeNewBlock(txHashes) block.Height++ - for _, tx := range txs { - bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx) + for i, tx := range txs { + bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx, uint64(i)) bt.MustSave(st) } transactionOrder = append(transactionOrder, createdOrder...) @@ -448,8 +448,8 @@ func TestMultipleBlockTransactionsOrderByBlockHeightAndCursor(t *testing.T) { } block := TestMakeNewBlock(txHashes) - for _, tx := range txs { - bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx) + for i, tx := range txs { + bt := NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx, uint64(i)) bt.MustSave(st) } @@ -506,9 +506,9 @@ func TestMultipleBlockTransactionsOrderByBlockHeightAndCursor(t *testing.T) { } } -func makeNewBlockTransaction(networkID []byte, n int) BlockTransaction { +func makeNewBlockTransaction(networkID []byte, n int, index uint64) BlockTransaction { _, tx := transaction.TestMakeTransaction(networkID, n) block := TestMakeNewBlock([]string{tx.GetHash()}) - return NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx) + return NewBlockTransactionFromTransaction(block.Hash, block.Height, block.ProposedTime, tx, index) } diff --git a/lib/common/constant.go b/lib/common/constant.go index 62889697e..b3f7ad50f 100644 --- a/lib/common/constant.go +++ b/lib/common/constant.go @@ -43,6 +43,9 @@ const ( // DefaultTxPoolLimit is the default tx pool limit. DefaultTxPoolLimit int = 1000000 + + // ProposerTransactionIndex + ProposerTransactionIndex uint64 = 0 ) var ( diff --git a/lib/node/runner/api/base_test.go b/lib/node/runner/api/base_test.go index 200521337..eb539b79e 100644 --- a/lib/node/runner/api/base_test.go +++ b/lib/node/runner/api/base_test.go @@ -65,8 +65,8 @@ func prepareOpsWithoutSave(count int, st *storage.LevelDBBackend) (*keypair.Full theBlock := block.TestMakeNewBlockWithPrevBlock(block.GetLatestBlock(st), txHashes) for _, tx := range txs { - for _, op := range tx.B.Operations { - bo, err := block.NewBlockOperationFromOperation(op, tx, theBlock.Height) + for i, op := range tx.B.Operations { + bo, err := block.NewBlockOperationFromOperation(op, tx, theBlock.Height, uint64(i)) if err != nil { panic(err) } @@ -90,8 +90,8 @@ func prepareTxs(storage *storage.LevelDBBackend, count int) (*keypair.Full, []bl theBlock := block.TestMakeNewBlockWithPrevBlock(block.GetLatestBlock(storage), txHashes) theBlock.MustSave(storage) - for _, tx := range txs { - bt := block.NewBlockTransactionFromTransaction(theBlock.Hash, theBlock.Height, theBlock.ProposedTime, tx) + for i, tx := range txs { + bt := block.NewBlockTransactionFromTransaction(theBlock.Hash, theBlock.Height, theBlock.ProposedTime, tx, uint64(i)) bt.MustSave(storage) if err := bt.SaveBlockOperations(storage); err != nil { return nil, nil @@ -113,8 +113,8 @@ func prepareTxsWithoutSave(count int, st *storage.LevelDBBackend) (*keypair.Full } theBlock := block.TestMakeNewBlockWithPrevBlock(block.GetLatestBlock(st), txHashes) - for _, tx := range txs { - bt := block.NewBlockTransactionFromTransaction(theBlock.Hash, theBlock.Height, theBlock.ProposedTime, tx) + for i, tx := range txs { + bt := block.NewBlockTransactionFromTransaction(theBlock.Hash, theBlock.Height, theBlock.ProposedTime, tx, uint64(i)) btList = append(btList, bt) } return kp, btList @@ -125,7 +125,7 @@ func prepareTxWithoutSave(st *storage.LevelDBBackend) (*keypair.Full, *transacti tx := transaction.TestMakeTransactionWithKeypair(networkID, 1, kp) theBlock := block.TestMakeNewBlockWithPrevBlock(block.GetLatestBlock(st), []string{tx.GetHash()}) - bt := block.NewBlockTransactionFromTransaction(theBlock.Hash, theBlock.Height, theBlock.ProposedTime, tx) + bt := block.NewBlockTransactionFromTransaction(theBlock.Hash, theBlock.Height, theBlock.ProposedTime, tx, 0) return kp, &tx, &bt } diff --git a/lib/node/runner/api/resource/operation.go b/lib/node/runner/api/resource/operation.go index 8df5651b7..328384ef1 100644 --- a/lib/node/runner/api/resource/operation.go +++ b/lib/node/runner/api/resource/operation.go @@ -28,6 +28,7 @@ func (o Operation) GetMap() hal.Entry { "source": o.bo.Source, "type": o.bo.Type, "tx_hash": o.bo.TxHash, + "index": o.bo.Index, "body": body, } } diff --git a/lib/node/runner/api/resource/resource_test.go b/lib/node/runner/api/resource/resource_test.go index 4035ef9e9..e0fe1c7c3 100644 --- a/lib/node/runner/api/resource/resource_test.go +++ b/lib/node/runner/api/resource/resource_test.go @@ -46,7 +46,7 @@ func TestResourceAccount(t *testing.T) { // Transaction { _, tx := transaction.TestMakeTransaction([]byte{0x00}, 1) - bt := block.NewBlockTransactionFromTransaction("dummy", 0, common.NowISO8601(), tx) + bt := block.NewBlockTransactionFromTransaction("dummy", 0, common.NowISO8601(), tx, 0) bt.MustSave(storage) rt := NewTransaction(&bt) @@ -72,7 +72,7 @@ func TestResourceAccount(t *testing.T) { // Operation { _, tx := transaction.TestMakeTransaction([]byte{0x00}, 1) - bt := block.NewBlockTransactionFromTransaction(common.GetUniqueIDFromUUID(), 0, common.NowISO8601(), tx) + bt := block.NewBlockTransactionFromTransaction(common.GetUniqueIDFromUUID(), 0, common.NowISO8601(), tx, 0) bt.MustSave(storage) bo, _ := block.GetBlockOperation(storage, bt.Operations[0]) @@ -96,7 +96,7 @@ func TestResourceAccount(t *testing.T) { { var err error _, tx := transaction.TestMakeTransaction([]byte{0x00}, 3) - bt := block.NewBlockTransactionFromTransaction(blk.Hash, blk.Height, common.NowISO8601(), tx) + bt := block.NewBlockTransactionFromTransaction(blk.Hash, blk.Height, common.NowISO8601(), tx, 0) bt.MustSave(storage) err = bt.SaveBlockOperations(storage) require.NoError(t, err) diff --git a/lib/node/runner/api/resource/transaction.go b/lib/node/runner/api/resource/transaction.go index cee653a5f..23b50adb8 100644 --- a/lib/node/runner/api/resource/transaction.go +++ b/lib/node/runner/api/resource/transaction.go @@ -27,6 +27,7 @@ func (t Transaction) GetMap() hal.Entry { "sequence_id": t.bt.SequenceID, "created": t.bt.Created, "operation_count": len(t.bt.Operations), + "index": t.bt.Index, } } func (t Transaction) Resource() *hal.Resource { diff --git a/lib/node/runner/api/tx_operations_test.go b/lib/node/runner/api/tx_operations_test.go index 4a4ec1e96..9d6805f3b 100644 --- a/lib/node/runner/api/tx_operations_test.go +++ b/lib/node/runner/api/tx_operations_test.go @@ -73,11 +73,11 @@ func TestGetOperationsByTxHashHandlerStream(t *testing.T) { kp := keypair.Random() tx := transaction.TestMakeTransactionWithKeypair(networkID, 10, kp) - bt := block.NewBlockTransactionFromTransaction("block-hash", 1, common.NowISO8601(), tx) + bt := block.NewBlockTransactionFromTransaction("block-hash", 1, common.NowISO8601(), tx, 0) boMap := make(map[string]block.BlockOperation) - for _, op := range tx.B.Operations { - bo, err := block.NewBlockOperationFromOperation(op, tx, 0) + for i, op := range tx.B.Operations { + bo, err := block.NewBlockOperationFromOperation(op, tx, 0, uint64(i)) require.NoError(t, err) boMap[bo.Hash] = bo } diff --git a/lib/node/runner/api_block_test.go b/lib/node/runner/api_block_test.go index 4fdc2b020..af88a75d6 100644 --- a/lib/node/runner/api_block_test.go +++ b/lib/node/runner/api_block_test.go @@ -56,8 +56,8 @@ func (p *HelperTestGetBlocksHandler) createBlock() block.Block { bk := block.TestMakeNewBlockWithPrevBlock(block.GetLatestBlock(p.st), txHashes) bk.MustSave(p.st) - for _, tx := range txs { - btx := block.NewBlockTransactionFromTransaction(bk.Hash, bk.Height, bk.ProposedTime, tx) + for i, tx := range txs { + btx := block.NewBlockTransactionFromTransaction(bk.Hash, bk.Height, bk.ProposedTime, tx, uint64(i)) btx.MustSave(p.st) btx.SaveBlockOperations(p.st) block.SaveTransactionPool(p.st, tx) diff --git a/lib/node/runner/api_transactions_test.go b/lib/node/runner/api_transactions_test.go index 95c061163..5ecd4d2a4 100644 --- a/lib/node/runner/api_transactions_test.go +++ b/lib/node/runner/api_transactions_test.go @@ -109,8 +109,8 @@ func (p *HelperTestGetNodeTransactionsHandler) createBlock() block.Block { bk.Height = uint64(height + 1) bk.MustSave(p.st) - for _, tx := range txs { - btx := block.NewBlockTransactionFromTransaction(bk.Hash, bk.Height, bk.ProposedTime, tx) + for i, tx := range txs { + btx := block.NewBlockTransactionFromTransaction(bk.Hash, bk.Height, bk.ProposedTime, tx, uint64(i)) if err := btx.Save(p.st); err != nil { panic(err) } diff --git a/lib/node/runner/block_operations.go b/lib/node/runner/block_operations.go index bebeb9723..febd6cc34 100644 --- a/lib/node/runner/block_operations.go +++ b/lib/node/runner/block_operations.go @@ -182,7 +182,7 @@ func (sb *SavingBlockOperations) CheckTransactionByBlock(st *storage.LevelDBBack bt.Message = tp.Message } - for _, op := range bt.Transaction().B.Operations { + for i, op := range bt.Transaction().B.Operations { opHash := block.NewBlockOperationKey(op.MakeHashString(), hash) var exists bool @@ -197,7 +197,7 @@ func (sb *SavingBlockOperations) CheckTransactionByBlock(st *storage.LevelDBBack } if !exists { - if err = bt.SaveBlockOperation(st, op); err != nil { + if err = bt.SaveBlockOperation(st, op, uint64(i)); err != nil { return err } sb.log.Debug("saved missing BlockOperation", "block", blk, "transaction", hash, "operation", op) diff --git a/lib/node/runner/block_operations_test.go b/lib/node/runner/block_operations_test.go index a72a27acf..f1bc041ee 100644 --- a/lib/node/runner/block_operations_test.go +++ b/lib/node/runner/block_operations_test.go @@ -54,7 +54,7 @@ func (p *TestSavingBlockOperationHelper) makeBlock(prevBlock block.Block, numTxs opi, _ := ballot.NewInflationFromBallot(*blt, block.CommonKP.Address(), common.BaseReserve) opc, _ := ballot.NewCollectTxFeeFromBallot(*blt, block.CommonKP.Address(), txs...) ptx, _ := ballot.NewProposerTransactionFromBallot(*blt, opc, opi) - bt := block.NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, ptx.Transaction) + bt := block.NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, ptx.Transaction, common.ProposerTransactionIndex) bt.MustSave(p.st) block.SaveTransactionPool(p.st, ptx.Transaction) @@ -62,8 +62,8 @@ func (p *TestSavingBlockOperationHelper) makeBlock(prevBlock block.Block, numTxs blk.MustSave(p.st) - for _, tx := range txs { - bt := block.NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, tx) + for i, tx := range txs { + bt := block.NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, tx, uint64(i+1)) bt.MustSave(p.st) } diff --git a/lib/node/runner/finish_ballot.go b/lib/node/runner/finish_ballot.go index 96b4eb630..cd829d3cb 100644 --- a/lib/node/runner/finish_ballot.go +++ b/lib/node/runner/finish_ballot.go @@ -5,6 +5,7 @@ import ( "boscoin.io/sebak/lib/ballot" "boscoin.io/sebak/lib/block" + "boscoin.io/sebak/lib/common" "boscoin.io/sebak/lib/errors" "boscoin.io/sebak/lib/metrics" "boscoin.io/sebak/lib/storage" @@ -132,8 +133,9 @@ func getProposedTransactions(st *storage.LevelDBBackend, pTxHashes []string, tra } func FinishTransactions(blk block.Block, transactions []*transaction.Transaction, st *storage.LevelDBBackend) (err error) { - for _, tx := range transactions { - bt := block.NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, *tx) + for i, tx := range transactions { + // i = 0 is an index of proposerTransaction + bt := block.NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, *tx, uint64(i+1)) if err = bt.Save(st); err != nil { return } @@ -294,7 +296,7 @@ func FinishProposerTransaction(st *storage.LevelDBBackend, blk block.Block, ptx } } - bt := block.NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, ptx.Transaction) + bt := block.NewBlockTransactionFromTransaction(blk.Hash, blk.Height, blk.ProposedTime, ptx.Transaction, common.ProposerTransactionIndex) if err = bt.Save(st); err != nil { return }