void bitclient_addVarIntFromStream(stream_t* msgStream, uint64 varInt) { if( varInt <= 0xFC ) { stream_writeU8(msgStream, (uint8)varInt); return; } else if( varInt <= 0xFFFF ) { stream_writeU8(msgStream, 0xFD); stream_writeU16(msgStream, (uint16)varInt); return; } else if( varInt <= 0xFFFFFFFF ) { stream_writeU8(msgStream, 0xFE); stream_writeU32(msgStream, (uint32)varInt); return; } else { stream_writeU8(msgStream, 0xFF); stream_writeData(msgStream, &varInt, 8); return; } }
void bitclient_writeTransactionToStream(stream_t* dataStream, bitclientTransaction_t* tx) { stream_writeU32(dataStream, tx->version); bitclient_addVarIntFromStream(dataStream, tx->tx_in->objectCount); for(uint32 i=0; i<tx->tx_in->objectCount; i++) { bitclientVIn_t* vin = (bitclientVIn_t*)tx->tx_in->objects[i]; stream_writeData(dataStream, vin->previous_output.hash, 32); stream_writeU32(dataStream, vin->previous_output.index); bitclient_addVarIntFromStream(dataStream, vin->scriptSignatureLength); stream_writeData(dataStream, vin->scriptSignatureData, vin->scriptSignatureLength); stream_writeU32(dataStream, vin->sequence); } bitclient_addVarIntFromStream(dataStream, tx->tx_out->objectCount); for(uint32 i=0; i<tx->tx_out->objectCount; i++) { bitclientVOut_t* vout = (bitclientVOut_t*)tx->tx_out->objects[i]; stream_writeData(dataStream, &vout->coinValue, 8); bitclient_addVarIntFromStream(dataStream, vout->scriptPkLength); stream_writeData(dataStream, vout->scriptPkData, vout->scriptPkLength); } stream_writeU32(dataStream, 0); // lock time }