Golang implemented sidechain for Bytom
Revision | 0d2d815af7de0672914ff2baec752f75e07a5520 (tree) |
---|---|
Zeit | 2019-11-27 20:05:31 |
Autor | Paladz <yzhu101@uott...> |
Commiter | GitHub |
Merge branch 'mov' into fix_core_sync
@@ -152,7 +152,7 @@ func (fs *fastSync) process() error { | ||
152 | 152 | // sync length cannot be greater than maxFastSyncBlocksNum. |
153 | 153 | func (fs *fastSync) findSyncRange() (*types.Block, error) { |
154 | 154 | bestHeight := fs.chain.BestBlockHeight() |
155 | - length := fs.mainSyncPeer.IrreversibleHeight() - fastSyncPivotGap - bestHeight | |
155 | + length := fs.mainSyncPeer.Height() - fastSyncPivotGap - bestHeight | |
156 | 156 | if length > maxNumOfBlocksPerSync { |
157 | 157 | length = maxNumOfBlocksPerSync |
158 | 158 | } |
@@ -182,8 +182,11 @@ func (b *blockBuilder) build() (*types.Block, error) { | ||
182 | 182 | return nil, err |
183 | 183 | } |
184 | 184 | |
185 | - _, err := b.chain.SignBlock(b.block) | |
186 | - return b.block, err | |
185 | + if err := b.chain.SignBlockHeader(&b.block.BlockHeader); err != nil { | |
186 | + return nil, err | |
187 | + } | |
188 | + | |
189 | + return b.block, nil | |
187 | 190 | } |
188 | 191 | |
189 | 192 | func (b *blockBuilder) calcBlockCommitment() (err error) { |
@@ -199,27 +199,51 @@ func (c *Chain) ProcessBlockSignature(signature, xPub []byte, blockHash *bc.Hash | ||
199 | 199 | return c.eventDispatcher.Post(event.BlockSignatureEvent{BlockHash: *blockHash, Signature: signature, XPub: xPub}) |
200 | 200 | } |
201 | 201 | |
202 | -// SignBlock signing the block if current node is consensus node | |
203 | -func (c *Chain) SignBlock(block *types.Block) ([]byte, error) { | |
202 | +// SignBlockHeader signing the block if current node is consensus node | |
203 | +func (c *Chain) SignBlockHeader(blockHeader *types.BlockHeader) error { | |
204 | + _, err := c.signBlockHeader(blockHeader) | |
205 | + return err | |
206 | +} | |
207 | + | |
208 | +func (c *Chain) applyBlockSign(blockHeader *types.BlockHeader) error { | |
209 | + signature, err := c.signBlockHeader(blockHeader) | |
210 | + if err != nil { | |
211 | + return err | |
212 | + } | |
213 | + | |
214 | + if len(signature) == 0 { | |
215 | + return nil | |
216 | + } | |
217 | + | |
218 | + if err := c.store.SaveBlockHeader(blockHeader); err != nil { | |
219 | + return err | |
220 | + } | |
221 | + | |
222 | + xpub := config.CommonConfig.PrivateKey().XPub() | |
223 | + return c.eventDispatcher.Post(event.BlockSignatureEvent{BlockHash: blockHeader.Hash(), Signature: signature, XPub: xpub[:]}) | |
224 | +} | |
225 | + | |
226 | +func (c *Chain) signBlockHeader(blockHeader *types.BlockHeader) ([]byte, error) { | |
204 | 227 | xprv := config.CommonConfig.PrivateKey() |
205 | - xpubStr := xprv.XPub().String() | |
206 | - node, err := c.getConsensusNode(&block.PreviousBlockHash, xpubStr) | |
228 | + xpub := xprv.XPub() | |
229 | + node, err := c.getConsensusNode(&blockHeader.PreviousBlockHash, xpub.String()) | |
207 | 230 | if err == errNotFoundConsensusNode { |
208 | 231 | return nil, nil |
209 | 232 | } else if err != nil { |
210 | 233 | return nil, err |
211 | 234 | } |
212 | 235 | |
213 | - if err := c.checkDoubleSign(&block.BlockHeader, node.XPub.String()); err == errDoubleSignBlock { | |
236 | + if err := c.checkDoubleSign(blockHeader, node.XPub.String()); err == errDoubleSignBlock { | |
214 | 237 | return nil, nil |
215 | 238 | } else if err != nil { |
216 | 239 | return nil, err |
217 | 240 | } |
218 | 241 | |
219 | - signature := block.Get(node.Order) | |
220 | - if len(signature) == 0 { | |
221 | - signature = xprv.Sign(block.Hash().Bytes()) | |
222 | - block.Set(node.Order, signature) | |
242 | + if signature := blockHeader.Get(node.Order); len(signature) != 0 { | |
243 | + return nil, nil | |
223 | 244 | } |
245 | + | |
246 | + signature := xprv.Sign(blockHeader.Hash().Bytes()) | |
247 | + blockHeader.Set(node.Order, signature) | |
224 | 248 | return signature, nil |
225 | 249 | } |
@@ -3,9 +3,7 @@ package protocol | ||
3 | 3 | import ( |
4 | 4 | log "github.com/sirupsen/logrus" |
5 | 5 | |
6 | - "github.com/vapor/config" | |
7 | 6 | "github.com/vapor/errors" |
8 | - "github.com/vapor/event" | |
9 | 7 | "github.com/vapor/protocol/bc" |
10 | 8 | "github.com/vapor/protocol/bc/types" |
11 | 9 | "github.com/vapor/protocol/state" |
@@ -120,6 +118,10 @@ func (c *Chain) connectBlock(block *types.Block) (err error) { | ||
120 | 118 | } |
121 | 119 | } |
122 | 120 | |
121 | + if err := c.applyBlockSign(&block.BlockHeader); err != nil { | |
122 | + return err | |
123 | + } | |
124 | + | |
123 | 125 | irrBlockHeader := c.lastIrrBlockHeader |
124 | 126 | if c.isIrreversible(&block.BlockHeader) && block.Height > irrBlockHeader.Height { |
125 | 127 | irrBlockHeader = &block.BlockHeader |
@@ -231,6 +233,10 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error { | ||
231 | 233 | consensusResults = append(consensusResults, consensusResult.Fork()) |
232 | 234 | } |
233 | 235 | |
236 | + if err := c.applyBlockSign(attachBlockHeader); err != nil { | |
237 | + return err | |
238 | + } | |
239 | + | |
234 | 240 | if c.isIrreversible(attachBlockHeader) && attachBlockHeader.Height > irrBlockHeader.Height { |
235 | 241 | irrBlockHeader = attachBlockHeader |
236 | 242 | } |
@@ -309,22 +315,11 @@ func (c *Chain) saveBlock(block *types.Block) error { | ||
309 | 315 | } |
310 | 316 | } |
311 | 317 | |
312 | - signature, err := c.SignBlock(block) | |
313 | - if err != nil { | |
314 | - return errors.Sub(ErrBadBlock, err) | |
315 | - } | |
316 | - | |
317 | 318 | if err := c.store.SaveBlock(block, bcBlock.TransactionStatus); err != nil { |
318 | 319 | return err |
319 | 320 | } |
320 | - c.orphanManage.Delete(&bcBlock.ID) | |
321 | 321 | |
322 | - if len(signature) != 0 { | |
323 | - xPub := config.CommonConfig.PrivateKey().XPub() | |
324 | - if err := c.eventDispatcher.Post(event.BlockSignatureEvent{BlockHash: block.Hash(), Signature: signature, XPub: xPub[:]}); err != nil { | |
325 | - return err | |
326 | - } | |
327 | - } | |
322 | + c.orphanManage.Delete(&bcBlock.ID) | |
328 | 323 | return nil |
329 | 324 | } |
330 | 325 |