Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
AgwaB committed Sep 15, 2018
1 parent 4790be5 commit 3ef7cae
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 105 deletions.
36 changes: 36 additions & 0 deletions blockchain/api/block_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand Down Expand Up @@ -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
}
1 change: 1 addition & 0 deletions blockchain/api/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
28 changes: 8 additions & 20 deletions blockchain/infra/adapter/block_propose_command_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
}

Expand All @@ -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()}
}

Expand Down
59 changes: 12 additions & 47 deletions blockchain/infra/adapter/block_propose_command_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,7 @@ import (

"time"

"errors"

"github.com/it-chain/engine/blockchain/api"
"github.com/it-chain/engine/blockchain/api"
"github.com/it-chain/engine/blockchain/infra/mem"
"github.com/it-chain/engine/blockchain/test/mock"
"github.com/it-chain/engine/common"
Expand All @@ -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"
Expand All @@ -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})
Expand Down Expand Up @@ -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)

Expand All @@ -165,25 +158,14 @@ 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()

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{
Expand All @@ -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)

Expand All @@ -222,25 +204,14 @@ 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()

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{
Expand Down Expand Up @@ -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)
Expand All @@ -288,20 +259,14 @@ 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()

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})
Expand Down Expand Up @@ -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{})

}
14 changes: 0 additions & 14 deletions blockchain/infra/adapter/consensus_service.go

This file was deleted.

2 changes: 2 additions & 0 deletions blockchain/infra/adapter/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
8 changes: 8 additions & 0 deletions blockchain/test/mock/mock_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
24 changes: 0 additions & 24 deletions conf/config.yaml

This file was deleted.

0 comments on commit 3ef7cae

Please sign in to comment.