bool CBInitNode(CBNode * self, CBDepObject database, CBNodeFlags flags, CBNodeCallbacks nodeCallbacks, CBNetworkCommunicatorCallbacks commCallbacks, CBOnMessageReceivedAction (*onMessageReceived)(CBNode *, CBPeer *, CBMessage *)){ self->flags = flags; self->database = database; self->callbacks = nodeCallbacks; self->onMessageReceived = onMessageReceived; // Initialise network communicator CBNetworkCommunicator * comm = CBGetNetworkCommunicator(self); commCallbacks.onMessageReceived = CBNodeOnMessageReceived; CBInitNetworkCommunicator(comm, CB_SERVICE_FULL_BLOCKS, commCallbacks); // Set network communicator fields. comm->flags = CB_NETWORK_COMMUNICATOR_AUTO_DISCOVERY | CB_NETWORK_COMMUNICATOR_AUTO_HANDSHAKE | CB_NETWORK_COMMUNICATOR_AUTO_PING; if (flags & CB_NODE_BOOTSTRAP) comm->flags |= CB_NETWORK_COMMUNICATOR_BOOTSTRAP; comm->version = CB_PONG_VERSION; comm->networkID = CB_PRODUCTION_NETWORK_BYTES; // ??? Add testnet support CBNetworkCommunicatorSetAlternativeMessages(comm, NULL, NULL); // Create address manager comm->addresses = CBNewNetworkAddressManager(CBNodeOnBadTime); comm->addresses->maxAddressesInBucket = 1000; comm->addresses->callbackHandler = self; // Initialise thread data self->shutDownThread = false; self->messageQueue = NULL; CBNewMutex(&self->blockAndTxMutex); CBNewMutex(&self->messageProcessMutex); CBNewCondition(&self->messageProcessWaitCond); CBNewThread(&self->messageProcessThread, CBNodeProcessMessages, self); // Initialise the storage objects if (CBNewBlockChainStorage(&self->blockChainStorage, database)) { if (CBNewAccounterStorage(&self->accounterStorage, database)){ if (CBNewNodeStorage(&self->nodeStorage, database)){ // Setup address storage if (CBNewAddressStorage(&comm->addrStorage, database)) { if (CBAddressStorageLoadAddresses(comm->addrStorage, comm->addresses)){ comm->useAddrStorage = true; return true; } }else CBLogError("Could not create the address storage object for a node"); CBFreeNodeStorage(self->nodeStorage); }else CBLogError("Could not create the node storage object for a node"); CBFreeAccounterStorage(self->accounterStorage); }else CBLogError("Could not create the accounter storage object for a node"); CBFreeBlockChainStorage(self->blockChainStorage); }else CBLogError("Could not create the block storage object for a node"); CBDestroyNetworkCommunicator(self); return false; }
bool BEInitFullNode(BEFullNode * self,void (*onErrorReceived)(CBError error,char *,...)){ if (NOT CBInitNetworkCommunicator(CBGetNetworkCommunicator(self), onErrorReceived)) return false; // Set network communicator fields. CBGetNetworkCommunicator(self)->blockHeight = 0; CBGetNetworkCommunicator(self)->callbackHandler = self; CBGetNetworkCommunicator(self)->flags = CB_NETWORK_COMMUNICATOR_AUTO_DISCOVERY | CB_NETWORK_COMMUNICATOR_AUTO_HANDSHAKE | CB_NETWORK_COMMUNICATOR_AUTO_PING; CBGetNetworkCommunicator(self)->version = CB_PONG_VERSION; CBNetworkCommunicatorSetAlternativeMessages(CBGetNetworkCommunicator(self), NULL, NULL); // Find home directory. const char * homeDir; struct passwd * pwd = getpwuid(getuid()); if (NOT pwd) return false; homeDir = pwd->pw_dir; unsigned long homeLen = strlen(homeDir); // Open or create a new address store unsigned long dataDirLen = strlen(BE_DATA_DIRECTORY); char * addressFilePath = malloc(homeLen + dataDirLen + strlen(BE_ADDRESS_DATA_FILE) + 1); memcpy(addressFilePath, homeDir, homeLen); memcpy(addressFilePath + homeLen, BE_DATA_DIRECTORY, strlen(BE_DATA_DIRECTORY)); strcpy(addressFilePath + homeLen + dataDirLen, BE_ADDRESS_DATA_FILE); self->addressFile = fopen(addressFilePath, "rb+"); if (self->addressFile) { // The address store exists. free(addressFilePath); // Get the file length fseek(self->addressFile, 0, SEEK_END); unsigned long fileLen = ftell(self->addressFile); fseek(self->addressFile, 0, SEEK_SET); // Read file into a CBByteArray CBByteArray * buffer = CBNewByteArrayOfSize((uint32_t)fileLen, onErrorReceived); if (NOT buffer) { fclose(self->addressFile); return false; } if(fread(CBByteArrayGetData(buffer), fileLen, 1, self->addressFile) != fileLen){ CBReleaseObject(buffer); fclose(self->addressFile); return false; } // Create the CBAddressManager CBGetNetworkCommunicator(self)->addresses = CBNewAddressManagerFromData(buffer, onErrorReceived, BEFullNodeOnBadTime); CBReleaseObject(buffer); if (NOT CBAddressManagerDeserialise(CBGetNetworkCommunicator(self)->addresses)){ fclose(self->addressFile); CBReleaseObject(CBGetNetworkCommunicator(self)->addresses); onErrorReceived(CB_ERROR_INIT_FAIL,"There was an error when deserialising the CBAddressManager for the BEFullNode."); return false; } }else{ // The address store does not exist CBGetNetworkCommunicator(self)->addresses = CBNewAddressManager(onErrorReceived, BEFullNodeOnBadTime); if (NOT CBGetNetworkCommunicator(self)->addresses) return false; // Create the file self->addressFile = fopen(addressFilePath, "wb"); free(addressFilePath); if (NOT self->addressFile){ CBReleaseObject(CBGetNetworkCommunicator(self)->addresses); return false; } } // Create block validator return true; }