From 393c91c85ae650a8ca59433b361005efa5b5ae87 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Thu, 4 Oct 2018 17:12:56 +0800 Subject: [PATCH] Add /submit-block --- api/api.go | 8 +++++++- api/miner.go | 22 +++++++++++++++++++++- node/node.go | 6 +++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/api/api.go b/api/api.go index c37b55e9..1f89fe3e 100644 --- a/api/api.go +++ b/api/api.go @@ -25,6 +25,7 @@ import ( "github.com/bytom/net/http/static" "github.com/bytom/netsync" "github.com/bytom/protocol" + "github.com/bytom/protocol/bc" "github.com/bytom/wallet" ) @@ -113,6 +114,8 @@ type API struct { txFeedTracker *txfeed.Tracker cpuMiner *cpuminer.CPUMiner miningPool *miningpool.MiningPool + + newBlockCh chan *bc.Hash } func (a *API) initServer(config *cfg.Config) { @@ -169,7 +172,7 @@ func (a *API) StartServer(address string) { } // NewAPI create and initialize the API -func NewAPI(sync *netsync.SyncManager, wallet *wallet.Wallet, txfeeds *txfeed.Tracker, cpuMiner *cpuminer.CPUMiner, miningPool *miningpool.MiningPool, chain *protocol.Chain, config *cfg.Config, token *accesstoken.CredentialStore) *API { +func NewAPI(sync *netsync.SyncManager, wallet *wallet.Wallet, txfeeds *txfeed.Tracker, cpuMiner *cpuminer.CPUMiner, miningPool *miningpool.MiningPool, chain *protocol.Chain, config *cfg.Config, token *accesstoken.CredentialStore, newBlockCh chan *bc.Hash) *API { api := &API{ sync: sync, wallet: wallet, @@ -178,6 +181,8 @@ func NewAPI(sync *netsync.SyncManager, wallet *wallet.Wallet, txfeeds *txfeed.Tr txFeedTracker: txfeeds, cpuMiner: cpuMiner, miningPool: miningPool, + + newBlockCh: newBlockCh, } api.buildHandler() api.initServer(config) @@ -279,6 +284,7 @@ func (a *API) buildHandler() { m.Handle("/get-work", jsonHandler(a.getWork)) m.Handle("/get-work-json", jsonHandler(a.getWorkJSON)) + m.Handle("/submit-block", jsonHandler(a.submitBlock)) m.Handle("/submit-work", jsonHandler(a.submitWork)) m.Handle("/submit-work-json", jsonHandler(a.submitWorkJSON)) diff --git a/api/miner.go b/api/miner.go index 8607371f..5cb5a05c 100644 --- a/api/miner.go +++ b/api/miner.go @@ -68,7 +68,27 @@ func (a *API) getWorkJSON() Response { return NewSuccessResponse(work) } -// SubmitWorkJSONReq is req struct for submit-work API +// SubmitBlockReq is req struct for submit-block API +type SubmitBlockReq struct { + Block *types.Block `json:"raw_block"` +} + +// submitBlock trys to submit a raw block to the chain +func (a *API) submitBlock(ctx context.Context, req *SubmitBlockReq) Response { + isOrphan, err := a.chain.ProcessBlock(req.Block) + if err != nil { + return NewErrorResponse(err) + } + if isOrphan { + return NewErrorResponse(errors.New("block submitted is orphan")) + } + + blockHash := req.Block.BlockHeader.Hash() + a.newBlockCh <- &blockHash + return NewSuccessResponse(true) +} + +// SubmitWorkReq is req struct for submit-work API type SubmitWorkReq struct { BlockHeader *types.BlockHeader `json:"block_header"` } diff --git a/node/node.go b/node/node.go index 638c6167..8ea25c23 100644 --- a/node/node.go +++ b/node/node.go @@ -56,6 +56,8 @@ type Node struct { cpuMiner *cpuminer.CPUMiner miningPool *miningpool.MiningPool miningEnable bool + + newBlockCh chan *bc.Hash } func NewNode(config *cfg.Config) *Node { @@ -142,6 +144,8 @@ func NewNode(config *cfg.Config) *Node { chain: chain, txfeed: txFeed, miningEnable: config.Mining, + + newBlockCh: newBlockCh, } node.cpuMiner = cpuminer.NewCPUMiner(chain, accounts, txPool, newBlockCh) @@ -225,7 +229,7 @@ func launchWebBrowser(port string) { } func (n *Node) initAndstartApiServer() { - n.api = api.NewAPI(n.syncManager, n.wallet, n.txfeed, n.cpuMiner, n.miningPool, n.chain, n.config, n.accessTokens) + n.api = api.NewAPI(n.syncManager, n.wallet, n.txfeed, n.cpuMiner, n.miningPool, n.chain, n.config, n.accessTokens, n.newBlockCh) listenAddr := env.String("LISTEN", n.config.ApiAddress) env.Parse() -- 2.11.0