def getScriptSigMessage(tx, i): # -> bytes rawTx = "" rawTx += key.encode(tx["version"], 256, 4)[::-1] #rawTx += setCompactInt(len(prevTxs)) rawTx += setCompactInt(1) #for i in range(len(prevTxs)): rawTx += key.changeBase(tx["txIns"][i]["prevOutTxid"], 16, 256)[::-1] rawTx += key.encode(tx["txIns"][i]["prevOutIndex"], 256, 4)[::-1] tempScriptPubKey = key.changeBase(tx["txIns"][i]["prevOutScriptPubKey"], 16, 256)[::-1] rawTx += setCompactInt(len(tempScriptPubKey)) rawTx += tempScriptPubKey[::-1] rawTx += key.encode(tx["txIns"][i]["sequence"], 256, 4)[::-1] rawTx += setCompactInt(tx["numOut"]) for i in range(tx["numOut"]): rawTx += setTxOut(tx["txOuts"][i]) rawTx += key.encode(tx["lockTime"], 256, 4)[::-1] rawTx += key.encode(tx["sigHashCode"], 256, 4)[::-1] print 'rawTx' + binascii.hexlify(rawTx) return rawTx
def setCompactInt(value): # -> bytes if value <= 252: return key.encode(value, 256) elif value <= 0xffff: return '\xfd' + key.encode(value, 256, 2)[::-1] elif value <= 0xffffffff: return '\xfe' + key.encode(value, 256, 4)[::-1] else: return '\xff' + key.encode(value, 256, 8)[::-1]
def setTxIn(txIn): # -> bytes _rawTxIn = "" _rawTxIn += key.changeBase(txIn["prevOutTxid"], 16, 256)[::-1] _rawTxIn += key.encode(txIn["prevOutIndex"], 256, 4)[::-1] _rawTxIn += setCompactInt(txIn["lenScript"]) #scriptSig = setScriptSig(prevTxs, tx) #_rawTxIn += setCompactInt(len(scriptSig)) #_rawTxIn += scriptSig _rawTxIn += key.changeBase(txIn["scriptSig"], 16, 256) _rawTxIn += key.encode(txIn["sequence"], 256, 4)[::-1] return _rawTxIn
def setTxOut(txOut): # -> bytes _rawTxOut = "" _rawTxOut += key.encode(txOut["value"], 256, 8)[::-1] _rawTxOut += setCompactInt(txOut["lenScript"]) _rawTxOut += key.changeBase(txOut["scriptPubKey"], 16, 256) return _rawTxOut
def signTx(self, privKeys): for i in range(len(privKeys)): signedMessage = key.signMessage(getScriptSigMessage(self._tx, i), privKeys[i]) + '\x01' pubKey = privKeys[i].pubkey.serialize() scriptSig = key.encode(len(signedMessage), 256) + signedMessage + key.encode( len(pubKey), 256) + pubKey self._tx["txIns"][i]["lenScript"] = len(scriptSig) self._tx["txIns"][i]["scriptSig"] = binascii.hexlify(scriptSig) print binascii.hexlify(signedMessage[:-1]) print binascii.hexlify(getScriptSigMessage(self._tx, i)) print self._tx self._rawTx = txSerialize(self._tx)
def setScriptPubKey(pubKeyHash): # -> hex rawScriptPubKey = '76a9' rawScriptPubKey += key.encode(len(pubKeyHash), 16) rawScriptPubKey += binascii.hexlify(pubKeyHash) rawScriptPubKey += '88ac' return rawScriptPubKey
def txSerialize(tx): rawTx = "" rawTx += key.encode(tx["version"], 256, 4)[::-1] rawTx += setCompactInt(tx["numIn"]) for i in range(tx["numIn"]): rawTx += setTxIn(tx["txIns"][i]) rawTx += setCompactInt(tx["numOut"]) for i in range(tx["numOut"]): rawTx += setTxOut(tx["txOuts"][i]) rawTx += key.encode(tx["lockTime"], 256, 4)[::-1] return rawTx