uint32_t CBTransactionInputDeserialise(CBTransactionInput * self){ CBByteArray * bytes = CBGetMessage(self)->bytes; if (! bytes) { CBLogError("Attempting to deserialise a CBTransactionInput with no bytes."); return 0; } if (bytes->length < 41) { CBLogError("Attempting to deserialise a CBTransactionInput with less than 41 bytes."); return 0; } CBVarInt scriptLen = CBVarIntDecode(bytes, 36); if (scriptLen.val > 10000) { CBLogError("Attempting to deserialise a CBTransactionInput with too big a script."); return 0; } uint32_t reqLen = (uint32_t)(40 + scriptLen.size + scriptLen.val); if (bytes->length < reqLen) { CBLogError("Attempting to deserialise a CBTransactionInput with less bytes than needed according to the length for the script. %i < %i", bytes->length, reqLen); return 0; } // Deserialise by subreferencing byte arrays and reading integers. self->prevOut.hash = CBByteArraySubReference(bytes, 0, 32); self->prevOut.index = CBByteArrayReadInt32(bytes, 32); self->scriptObject = CBNewScriptFromReference(bytes, 36 + scriptLen.size, (uint32_t) scriptLen.val); self->sequence = CBByteArrayReadInt32(bytes, (uint32_t) (36 + scriptLen.size + scriptLen.val)); return reqLen; }
uint32_t CBTransactionOutputDeserialise(CBTransactionOutput * self){ CBByteArray * bytes = CBGetMessage(self)->bytes; if (NOT bytes) { CBLogError("Attempting to deserialise a CBTransactionOutput with no bytes."); return 0; } if (bytes->length < 9) { CBLogError("Attempting to deserialise a CBTransactionOutput with less than 9 bytes."); return 0; } uint8_t x = CBByteArrayGetByte(bytes, 8); // Check length for decoding CBVarInt if (x < 253) x = 9; else if (x == 253) x = 11; else if (x == 254) x = 13; else x = 17; if (bytes->length < x) { CBLogError("Attempting to deserialise a CBTransactionOutput with less than %i bytes required.", x); return 0; } CBVarInt scriptLen = CBVarIntDecode(bytes, 8); // Can now decode. if (scriptLen.val > 10000) { CBLogError("Attempting to deserialise a CBTransactionInput with too big a script."); return 0; } uint32_t reqLen = (uint32_t)(8 + scriptLen.size + scriptLen.val); if (bytes->length < reqLen) { CBLogError("Attempting to deserialise a CBTransactionOutput with less bytes than needed according to the length for the script. %i < %i", bytes->length, reqLen); return 0; } // Deserialise by subreferencing byte arrays and reading integers. self->value = CBByteArrayReadInt64(bytes, 0); self->scriptObject = CBNewScriptFromReference(bytes, 8 + scriptLen.size, (uint32_t) scriptLen.val); if (NOT self->scriptObject){ CBLogError("Cannot create a new CBScript in CBTransactionOutputDeserialise"); return 0; } return reqLen; }
uint32_t CBTransactionInputDeserialise(CBTransactionInput * self){ CBByteArray * bytes = CBGetMessage(self)->bytes; if (NOT bytes) { CBGetMessage(self)->onErrorReceived(CB_ERROR_MESSAGE_DESERIALISATION_NULL_BYTES,"Attempting to deserialise a CBTransactionInput with no bytes."); return 0; } if (bytes->length < 41) { CBGetMessage(self)->onErrorReceived(CB_ERROR_MESSAGE_DESERIALISATION_BAD_BYTES,"Attempting to deserialise a CBTransactionInput with less than 41 bytes."); return 0; } CBVarInt scriptLen = CBVarIntDecode(bytes, 36); if (scriptLen.val > 10000) { CBGetMessage(self)->onErrorReceived(CB_ERROR_MESSAGE_DESERIALISATION_BAD_BYTES,"Attempting to deserialise a CBTransactionInput with too big a script."); return 0; } uint32_t reqLen = (uint32_t)(40 + scriptLen.size + scriptLen.val); if (bytes->length < reqLen) { CBGetMessage(self)->onErrorReceived(CB_ERROR_MESSAGE_DESERIALISATION_BAD_BYTES,"Attempting to deserialise a CBTransactionInput with less bytes than needed according to the length for the script. %i < %i",bytes->length, reqLen); return 0; } // Deserialise by subreferencing byte arrays and reading integers. self->prevOut.hash = CBByteArraySubReference(bytes, 0, 32); if (NOT self->prevOut.hash){ CBGetMessage(self)->onErrorReceived(CB_ERROR_INIT_FAIL,"Cannot create a new CBByteArray in CBTransactionInputDeserialise"); return 0; } self->prevOut.index = CBByteArrayReadInt32(bytes, 32); self->scriptObject = CBNewScriptFromReference(bytes,36 + scriptLen.size, (uint32_t) scriptLen.val); if (NOT self->scriptObject) { CBGetMessage(self)->onErrorReceived(CB_ERROR_INIT_FAIL,"Cannot create a new CBScript in CBTransactionInputDeserialise"); CBReleaseObject(self->prevOut.hash); return 0; } self->sequence = CBByteArrayReadInt32(bytes, (uint32_t) (36 + scriptLen.size + scriptLen.val)); return reqLen; }