// New creates a transaction pool that is ready to receive transactions. func New(cs modules.ConsensusSet, g modules.Gateway) (*TransactionPool, error) { // Check that the input modules are non-nil. if cs == nil { return nil, errNilCS } if g == nil { return nil, errNilGateway } // Initialize a transaction pool. tp := &TransactionPool{ consensusSet: cs, gateway: g, knownObjects: make(map[ObjectID]TransactionSetID), transactionSets: make(map[TransactionSetID][]types.Transaction), transactionSetDiffs: make(map[TransactionSetID]modules.ConsensusChange), // The consensus change index is intialized to '-1', which indicates // that no consensus changes have been sent yet. The first consensus // change will then have an index of '0'. consensusChangeIndex: -1, } // Register RPCs g.RegisterRPC("RelayTransactionSet", tp.relayTransactionSet) // Subscribe the transaction pool to the consensus set. cs.ConsensusSetPersistentSubscribe(tp, modules.ConsensusChangeID{}) return tp, nil }
// New creates the internal data structures, and subscribes to // consensus for changes to the blockchain func New(cs modules.ConsensusSet, persistDir string) (*Explorer, error) { // Check that input modules are non-nil if cs == nil { return nil, errNilCS } // Initialize the explorer. e := &Explorer{ blocksDifficulty: types.RootDepth, blockHashes: make(map[types.BlockID]types.BlockHeight), blockTargets: make(map[types.BlockID]types.Target), transactionHashes: make(map[types.TransactionID]types.BlockHeight), unlockHashes: make(map[types.UnlockHash]map[types.TransactionID]struct{}), siacoinOutputIDs: make(map[types.SiacoinOutputID]map[types.TransactionID]struct{}), siacoinOutputs: make(map[types.SiacoinOutputID]types.SiacoinOutput), fileContractIDs: make(map[types.FileContractID]map[types.TransactionID]struct{}), fileContractHistories: make(map[types.FileContractID]*fileContractHistory), siafundOutputIDs: make(map[types.SiafundOutputID]map[types.TransactionID]struct{}), siafundOutputs: make(map[types.SiafundOutputID]types.SiafundOutput), cs: cs, persistDir: persistDir, } e.blockchainHeight-- // Set to -1 so the genesis block sets the height to 0. // Intialize the persistent structures, including the database. err := e.initPersist() if err != nil { return nil, err } cs.ConsensusSetPersistentSubscribe(e, modules.ConsensusChangeID{}) return e, nil }
// New creates a transaction pool that is ready to receive transactions. func New(cs modules.ConsensusSet, g modules.Gateway) (*TransactionPool, error) { // Check that the input modules are non-nil. if cs == nil { return nil, errNilCS } if g == nil { return nil, errNilGateway } // Initialize a transaction pool. tp := &TransactionPool{ consensusSet: cs, gateway: g, knownObjects: make(map[ObjectID]TransactionSetID), transactionSets: make(map[TransactionSetID][]types.Transaction), transactionSetDiffs: make(map[TransactionSetID]modules.ConsensusChange), // The consensus change index is intialized to '-1', which indicates // that no consensus changes have been sent yet. The first consensus // change will then have an index of '0'. consensusChangeIndex: -1, } // Register RPCs // TODO: rename RelayTransactionSet so that the conflicting RPC // RelayTransaction calls v0.4.6 clients and earlier are ignored. g.RegisterRPC("RelayTransactionSet", tp.relayTransactionSet) // Subscribe the transaction pool to the consensus set. err := cs.ConsensusSetPersistentSubscribe(tp, modules.ConsensusChangeID{}) if err != nil { return nil, errors.New("transactionpool subscription failed: " + err.Error()) } return tp, nil }