// GetBlock returns a block from the chain func (h *Helper) GetBlock(blockNumber uint64) (block *pb.Block, err error) { ledger, err := ledger.GetLedger() if err != nil { return nil, fmt.Errorf("Failed to get the ledger :%v", err) } return ledger.GetBlockByNumber(blockNumber) }
func (i *Noops) getBlockData() (*pb.Block, *statemgmt.StateDelta, error) { ledger, err := ledger.GetLedger() if err != nil { return nil, nil, fmt.Errorf("Fail to get the ledger: %v", err) } blockHeight := ledger.GetBlockchainSize() if logger.IsEnabledFor(logging.DEBUG) { logger.Debug("Preparing to broadcast with block number %v", blockHeight) } block, err := ledger.GetBlockByNumber(blockHeight - 1) if nil != err { return nil, nil, err } //delta, err := ledger.GetStateDeltaBytes(blockHeight) delta, err := ledger.GetStateDelta(blockHeight - 1) if nil != err { return nil, nil, err } if logger.IsEnabledFor(logging.DEBUG) { logger.Debug("Got the delta state of block number %v", blockHeight) } return block, delta, nil }
// CommitTxBatch gets invoked when the current transaction-batch needs // to be committed. This function returns successfully iff the // transactions details and state changes (that may have happened // during execution of this transaction-batch) have been committed to // permanent storage. func (h *Helper) CommitTxBatch(id interface{}, metadata []byte) (*pb.Block, error) { ledger, err := ledger.GetLedger() if err != nil { return nil, fmt.Errorf("Failed to get the ledger: %v", err) } // TODO fix this one the ledger has been fixed to implement if err := ledger.CommitTxBatch(id, h.curBatch, nil, metadata); err != nil { return nil, fmt.Errorf("Failed to commit transaction to the ledger: %v", err) } size := ledger.GetBlockchainSize() h.curBatch = nil // TODO, remove after issue 579 block, err := ledger.GetBlockByNumber(size - 1) if err != nil { return nil, fmt.Errorf("Failed to get the block at the head of the chain: %v", err) } return block, nil }
func (i *Noops) notifyBlockAdded() error { ledger, err := ledger.GetLedger() if err != nil { return fmt.Errorf("Fail to get the ledger: %v", err) } // TODO: Broadcast SYNC_BLOCK_ADDED to connected NVPs // VPs already know about this newly added block since they participate // in the execution. That is, they can compare their current block with // the network block // For now, send to everyone until broadcast has better discrimination blockHeight := ledger.GetBlockchainSize() logger.Debug("Preparing to broadcast with block number %v", blockHeight) block, err := ledger.GetBlockByNumber(blockHeight - 1) if nil != err { return err } //delta, err := ledger.GetStateDeltaBytes(blockHeight) delta, err := ledger.GetStateDelta(blockHeight - 1) if nil != err { return err } logger.Debug("Got the delta state of block number %v", blockHeight) data, err := proto.Marshal(&pb.BlockState{Block: block, StateDelta: delta.Marshal()}) if err != nil { return fmt.Errorf("Fail to marshall BlockState structure: %v", err) } logger.Debug("Broadcasting OpenchainMessage_SYNC_BLOCK_ADDED") msg := &pb.OpenchainMessage{Type: pb.OpenchainMessage_SYNC_BLOCK_ADDED, Payload: data, Timestamp: util.CreateUtcTimestamp()} if errs := i.cpi.Broadcast(msg); nil != errs { return fmt.Errorf("Failed to broadcast with errors: %v", errs) } return nil }