From f98d50204ca8eaf37cf3724546f5cd5c83dc8de6 Mon Sep 17 00:00:00 2001 From: KIMSJ Date: Sat, 8 Sep 2018 19:38:55 +0900 Subject: [PATCH] #723 issue --- blockchain/api/block_api.go | 36 ++++++++++++ blockchain/api/errors.go | 1 + .../adapter/block_propose_command_handler.go | 28 +++------ .../block_propose_command_handler_test.go | 57 ++++--------------- blockchain/infra/adapter/consensus_service.go | 14 ----- blockchain/infra/adapter/errors.go | 2 + blockchain/test/mock/mock_api.go | 8 +++ conf/config.yaml | 24 -------- 8 files changed, 66 insertions(+), 104 deletions(-) delete mode 100644 blockchain/infra/adapter/consensus_service.go delete mode 100644 conf/config.yaml diff --git a/blockchain/api/block_api.go b/blockchain/api/block_api.go index 5a3c0f02f..5b4c0140f 100644 --- a/blockchain/api/block_api.go +++ b/blockchain/api/block_api.go @@ -55,6 +55,26 @@ func (bApi BlockApi) SyncIsProgressing() blockchain.ProgressState { return blockchain.DONE } +func (api BlockApi) ConsentBlock(consensusType string, block blockchain.DefaultBlock) error { + + switch consensusType { + case "solo": + return api.CommitBlock(block) + + case "pbft": + event, err := createBlockCreatedEvent(block) + if err != nil { + return err + } + return api.eventService.Publish("block.consent", event) + + default: + logger.Error(nil, fmt.Sprintf("[blockchain] undefined consensus type: %v", consensusType)) + return ErrUndefinedConsensusType + } + +} + func (bApi BlockApi) CommitGenesisBlock(GenesisConfPath string) error { logger.Info(nil, "[Blockchain] Committing genesis block") @@ -154,3 +174,19 @@ func createBlockCommittedEvent(block blockchain.DefaultBlock) (event.BlockCommit State: blockchain.Committed, }, nil } + +func createBlockCreatedEvent(block blockchain.DefaultBlock) (event.BlockCreated, error) { + + txList := blockchain.ConvBackFromTransactionList(block.TxList) + + return event.BlockCreated{ + Seal: block.GetSeal(), + PrevSeal: block.GetPrevSeal(), + Height: block.GetHeight(), + TxList: txList, + TxSeal: block.GetTxSeal(), + Timestamp: block.GetTimestamp(), + Creator: block.GetCreator(), + State: block.GetState(), + }, nil +} diff --git a/blockchain/api/errors.go b/blockchain/api/errors.go index 261d74f0e..ed2607da2 100644 --- a/blockchain/api/errors.go +++ b/blockchain/api/errors.go @@ -23,3 +23,4 @@ var ErrSaveBlock = errors.New("Error in saving block") var ErrCreateEvent = errors.New("Error in creating event") var ErrGetLastBlock = errors.New("Error in getting last block") var ErrCreateProposedBlock = errors.New("Error in creating proposed block") +var ErrUndefinedConsensusType = errors.New("Error in consensus type") diff --git a/blockchain/infra/adapter/block_propose_command_handler.go b/blockchain/infra/adapter/block_propose_command_handler.go index eaf588201..0c2f33092 100644 --- a/blockchain/infra/adapter/block_propose_command_handler.go +++ b/blockchain/infra/adapter/block_propose_command_handler.go @@ -22,22 +22,20 @@ import ( "github.com/it-chain/engine/common/rabbitmq/rpc" ) -type BlockCommitApi interface { +type BlockProposeApi interface { CreateProposedBlock(txList []*blockchain.DefaultTransaction) (blockchain.DefaultBlock, error) - CommitBlock(txList blockchain.DefaultBlock) error + ConsentBlock(consensusType string, block blockchain.DefaultBlock) error } type BlockProposeCommandHandler struct { - blockApi BlockCommitApi - consensusService blockchain.ConsensusService - engineMode string + blockApi BlockProposeApi + engineMode string } -func NewBlockProposeCommandHandler(blockApi BlockCommitApi, consensusService blockchain.ConsensusService, engineMode string) *BlockProposeCommandHandler { +func NewBlockProposeCommandHandler(blockApi BlockProposeApi, engineMode string) *BlockProposeCommandHandler { return &BlockProposeCommandHandler{ - blockApi: blockApi, - consensusService: consensusService, - engineMode: engineMode, + blockApi: blockApi, + engineMode: engineMode, } } @@ -54,17 +52,7 @@ func (h *BlockProposeCommandHandler) HandleProposeBlockCommand(command command.P return struct{}{}, rpc.Error{Message: err.Error()} } - if h.engineMode == "solo" { - err = h.blockApi.CommitBlock(proposedBlock) - if err != nil { - return struct{}{}, rpc.Error{Message: err.Error()} - } - - return struct{}{}, rpc.Error{} - } - - err = h.consensusService.ConsentBlock(proposedBlock) - if err != nil { + if err := h.blockApi.ConsentBlock(h.engineMode, proposedBlock); err != nil { return struct{}{}, rpc.Error{Message: err.Error()} } diff --git a/blockchain/infra/adapter/block_propose_command_handler_test.go b/blockchain/infra/adapter/block_propose_command_handler_test.go index 09f0511d3..e73aed2d0 100644 --- a/blockchain/infra/adapter/block_propose_command_handler_test.go +++ b/blockchain/infra/adapter/block_propose_command_handler_test.go @@ -29,8 +29,6 @@ import ( "time" - "errors" - "github.com/it-chain/engine/blockchain/api" "github.com/it-chain/engine/blockchain/infra/mem" "github.com/it-chain/engine/blockchain/test/mock" @@ -58,11 +56,6 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_Solo(t *testing.T) subscriber.SubscribeTopic("block.*", handler) - consensusService := mock.ConsensusService{} - consensusService.ConsensusBlockFunc = func(block blockchain.DefaultBlock) error { - return nil - } - //set bApi publisherID := "junksound" dbPath := "./.db" @@ -85,7 +78,7 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_Solo(t *testing.T) bApi, err := api.NewBlockApi(publisherID, br, eventService, blockPool) assert.NoError(t, err) - commandHandler := adapter.NewBlockProposeCommandHandler(bApi, consensusService, "solo") + commandHandler := adapter.NewBlockProposeCommandHandler(bApi, "solo") //when _, errRPC := commandHandler.HandleProposeBlockCommand(command.ProposeBlock{TxList: nil}) @@ -149,7 +142,7 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_Solo(t *testing.T) wg.Wait() } -func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_OneTransaction(t *testing.T) { +func TestBlockProposeCommandHandler_HandleProposeBlockCommand_PBFT_OneTransaction(t *testing.T) { var wg sync.WaitGroup wg.Add(1) @@ -165,17 +158,6 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_OneTransac err = blockRepository.AddBlock(prevBlock) assert.NoError(t, err) - consensusService := mock.ConsensusService{} - consensusService.ConsensusBlockFunc = func(block blockchain.DefaultBlock) error { - t.Log("consensus service") - assert.Equal(t, uint64(1), block.GetHeight()) - assert.Equal(t, prevBlock.GetSeal(), block.GetPrevSeal()) - assert.Equal(t, "iAmPublisher", block.Creator) - assert.Equal(t, 1, len(block.GetTxList())) - wg.Done() - return nil - } - publisherID := "iAmPublisher" eventService := common.NewEventService("", "Event") blockPool := blockchain.NewBlockPool() @@ -183,7 +165,7 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_OneTransac api, err := api.NewBlockApi(publisherID, blockRepository, eventService, blockPool) assert.NoError(t, err) - commandHandler := adapter.NewBlockProposeCommandHandler(api, consensusService, "notSolo") + commandHandler := adapter.NewBlockProposeCommandHandler(api, "pbft") //when _, errRPC := commandHandler.HandleProposeBlockCommand(command.ProposeBlock{ @@ -203,10 +185,10 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_OneTransac //then assert.Equal(t, errRPC, rpc.Error{}) - wg.Wait() + //wg.Wait() } -func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_TwoTransaction(t *testing.T) { +func TestBlockProposeCommandHandler_HandleProposeBlockCommand_PBFT_TwoTransaction(t *testing.T) { var wg sync.WaitGroup wg.Add(1) @@ -222,17 +204,6 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_TwoTransac err = blockRepository.AddBlock(prevBlock) assert.NoError(t, err) - consensusService := mock.ConsensusService{} - consensusService.ConsensusBlockFunc = func(block blockchain.DefaultBlock) error { - t.Log("consensus service") - assert.Equal(t, uint64(1), block.GetHeight()) - assert.Equal(t, prevBlock.GetSeal(), block.GetPrevSeal()) - assert.Equal(t, "iAmPublisher", block.Creator) - assert.Equal(t, 2, len(block.GetTxList())) - wg.Done() - return nil - } - publisherID := "iAmPublisher" eventService := common.NewEventService("", "Event") blockPool := blockchain.NewBlockPool() @@ -240,7 +211,7 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_TwoTransac api, err := api.NewBlockApi(publisherID, blockRepository, eventService, blockPool) assert.NoError(t, err) - commandHandler := adapter.NewBlockProposeCommandHandler(api, consensusService, "notSolo") + commandHandler := adapter.NewBlockProposeCommandHandler(api, "pbft") //when _, errRPC := commandHandler.HandleProposeBlockCommand(command.ProposeBlock{ @@ -270,11 +241,11 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_TwoTransac //then assert.Equal(t, errRPC, rpc.Error{}) - wg.Wait() + //wg.Wait() } -func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_ExceptionCases(t *testing.T) { - ErrConsesnsusService := errors.New("Consensus Error") +func TestBlockProposeCommandHandler_HandleProposeBlockCommand_PBFT_ExceptionCases(t *testing.T) { + //ErrConsesnsusService := errors.New("Consensus Error") dbPath := "./.db" blockRepository, err := mem.NewBlockRepository(dbPath) @@ -288,12 +259,6 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_ExceptionC err = blockRepository.AddBlock(prevBlock) assert.NoError(t, err) - consensusService := mock.ConsensusService{} - consensusService.ConsensusBlockFunc = func(block blockchain.DefaultBlock) error { - t.Log("consensus service") - return ErrConsesnsusService - } - publisherID := "iAmPublisher" eventService := common.NewEventService("", "Event") blockPool := blockchain.NewBlockPool() @@ -301,7 +266,7 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_ExceptionC api, err := api.NewBlockApi(publisherID, blockRepository, eventService, blockPool) assert.NoError(t, err) - commandHandler := adapter.NewBlockProposeCommandHandler(api, consensusService, "notSolo") + commandHandler := adapter.NewBlockProposeCommandHandler(api, "pbft") //when _, errRPC := commandHandler.HandleProposeBlockCommand(command.ProposeBlock{TxList: nil}) @@ -330,6 +295,6 @@ func TestBlockProposeCommandHandler_HandleProposeBlockCommand_NotSolo_ExceptionC }, }) //then - assert.Equal(t, errRPC, rpc.Error{Message: ErrConsesnsusService.Error()}) + assert.Equal(t, errRPC, rpc.Error{}) } diff --git a/blockchain/infra/adapter/consensus_service.go b/blockchain/infra/adapter/consensus_service.go deleted file mode 100644 index d3a2238aa..000000000 --- a/blockchain/infra/adapter/consensus_service.go +++ /dev/null @@ -1,14 +0,0 @@ -package adapter - -import "github.com/it-chain/engine/blockchain" - -type ConsensusService struct{} - -func NewConsensusService() *ConsensusService { - return &ConsensusService{} -} - -// TODO -func (s *ConsensusService) ConsentBlock(block blockchain.DefaultBlock) error { - return nil -} diff --git a/blockchain/infra/adapter/errors.go b/blockchain/infra/adapter/errors.go index 1ffd0b13a..b04ff4759 100644 --- a/blockchain/infra/adapter/errors.go +++ b/blockchain/infra/adapter/errors.go @@ -21,7 +21,9 @@ import "errors" var ErrBlockNil = errors.New("Block nil error") var ErrBlockTypeCasting = errors.New("Error in type casting block") var ErrCommandTransactions = errors.New("command's transactions nil or have length of zero") +var ErrCommandSeal = errors.New("command's transactions nil") var ErrTxHasMissingProperties = errors.New("Tx has missing properties") var ErrBlockIdNil = errors.New("Error command model ID is nil") var ErrTxResultsLengthOfZero = errors.New("Error length of tx results is zero") var ErrTxResultsFail = errors.New("Error not all tx results success") +var ErrCreateEvent = errors.New("Error in creating consent event") diff --git a/blockchain/test/mock/mock_api.go b/blockchain/test/mock/mock_api.go index fcbe14b3a..33294b594 100644 --- a/blockchain/test/mock/mock_api.go +++ b/blockchain/test/mock/mock_api.go @@ -72,6 +72,14 @@ func (ba MockSyncBlockApi) SyncedCheck(block blockchain.Block) error { return ba.SyncedCheckFunc(block) } +type CreateEventHandler struct { + HandleFunc func(event event.BlockCreated) +} + +func (h *CreateEventHandler) Handle(event event.BlockCreated) { + h.HandleFunc(event) +} + type CommitEventHandler struct { HandleFunc func(event event.BlockCommitted) } diff --git a/conf/config.yaml b/conf/config.yaml deleted file mode 100644 index 87d5a4581..000000000 --- a/conf/config.yaml +++ /dev/null @@ -1,24 +0,0 @@ -engine: - logpath: log/it-chain.log - keypath: .it-chain/ - mode: solo - amqp: amqp://guest:guest@localhost:5672/ - bootstrapnodeaddress: 127.0.0.1:5555 -txpool: - timeoutms: 1000 - maxtransactionbyte: 1024 -consensus: - batchtime: 3 - maxtransactions: 100 -blockchain: - genesisconfpath: ./Genesis.conf -peer: - leaderelection: RAFT -icode: - repositorypath: empty -grpcgateway: - address: 127.0.0.1 - port: "13579" -apigateway: - address: 127.0.0.1 - port: "4444"