-// ConnectBlock append block to end of chain
-func (c *Chain) ConnectBlock(block *types.Block) error {
- c.state.cond.L.Lock()
- defer c.state.cond.L.Unlock()
- return c.connectBlock(block)
+// GetHeaderByHash return a block header by given hash
+func (c *Chain) GetHeaderByHash(hash *bc.Hash) (*types.BlockHeader, error) {
+ node := c.index.GetNode(hash)
+ if node == nil {
+ return nil, errors.New("can't find block header in given hash")
+ }
+ return node.BlockHeader(), nil
+}
+
+// GetHeaderByHeight return a block header by given height
+func (c *Chain) GetHeaderByHeight(height uint64) (*types.BlockHeader, error) {
+ node := c.index.NodeByHeight(height)
+ if node == nil {
+ return nil, errors.New("can't find block header in given height")
+ }
+ return node.BlockHeader(), nil
+}
+
+func (c *Chain) calcReorganizeNodes(node *state.BlockNode) ([]*state.BlockNode, []*state.BlockNode) {
+ var attachNodes []*state.BlockNode
+ var detachNodes []*state.BlockNode
+
+ attachNode := node
+ for c.index.NodeByHeight(attachNode.Height) != attachNode {
+ attachNodes = append([]*state.BlockNode{attachNode}, attachNodes...)
+ attachNode = attachNode.Parent
+ }
+
+ detachNode := c.bestNode
+ for detachNode != attachNode {
+ detachNodes = append(detachNodes, detachNode)
+ detachNode = detachNode.Parent
+ }
+ return attachNodes, detachNodes