150 lines
6.1 KiB
Python
150 lines
6.1 KiB
Python
import binascii
|
|
import halfnode
|
|
import struct
|
|
import util
|
|
import settings
|
|
import lib.logger
|
|
log = lib.logger.get_logger('coinbasetx')
|
|
|
|
#if settings.COINDAEMON_Reward == 'POW':
|
|
class CoinbaseTransactionPOW(halfnode.CTransaction):
|
|
'''Construct special transaction used for coinbase tx.
|
|
It also implements quick serialization using pre-cached
|
|
scriptSig template.'''
|
|
|
|
extranonce_type = '>Q'
|
|
extranonce_placeholder = struct.pack(extranonce_type, int('f000000ff111111f', 16))
|
|
extranonce_size = struct.calcsize(extranonce_type)
|
|
|
|
def __init__(self, timestamper, coinbaser, value, flags, height, data):
|
|
super(CoinbaseTransactionPOW, self).__init__()
|
|
log.debug("Got to CoinBaseTX")
|
|
#self.extranonce = 0
|
|
|
|
if len(self.extranonce_placeholder) != self.extranonce_size:
|
|
raise Exception("Extranonce placeholder don't match expected length!")
|
|
|
|
tx_in = halfnode.CTxIn()
|
|
tx_in.prevout.hash = 0L
|
|
tx_in.prevout.n = 2**32-1
|
|
tx_in._scriptSig_template = (
|
|
util.ser_number(height) + binascii.unhexlify(flags) + util.ser_number(int(timestamper.time())) + \
|
|
chr(self.extranonce_size),
|
|
util.ser_string(coinbaser.get_coinbase_data() + data)
|
|
)
|
|
|
|
tx_in.scriptSig = tx_in._scriptSig_template[0] + self.extranonce_placeholder + tx_in._scriptSig_template[1]
|
|
|
|
tx_out = halfnode.CTxOut()
|
|
tx_out.nValue = value
|
|
tx_out.scriptPubKey = coinbaser.get_script_pubkey()
|
|
|
|
if settings.COINDAEMON_TX == 'yes':
|
|
self.strTxComment = "RanchiMall mining"
|
|
self.vin.append(tx_in)
|
|
self.vout.append(tx_out)
|
|
|
|
# Two parts of serialized coinbase, just put part1 + extranonce + part2 to have final serialized tx
|
|
self._serialized = super(CoinbaseTransactionPOW, self).serialize().split(self.extranonce_placeholder)
|
|
|
|
def set_extranonce(self, extranonce):
|
|
if len(extranonce) != self.extranonce_size:
|
|
raise Exception("Incorrect extranonce size")
|
|
|
|
(part1, part2) = self.vin[0]._scriptSig_template
|
|
self.vin[0].scriptSig = part1 + extranonce + part2
|
|
#elif settings.COINDAEMON_Reward == 'POS':
|
|
class CoinbaseTransactionPOS(halfnode.CTransaction):
|
|
'''Construct special transaction used for coinbase tx.
|
|
It also implements quick serialization using pre-cached
|
|
scriptSig template.'''
|
|
|
|
extranonce_type = '>Q'
|
|
extranonce_placeholder = struct.pack(extranonce_type, int('f000000ff111111f', 16))
|
|
extranonce_size = struct.calcsize(extranonce_type)
|
|
|
|
def __init__(self, timestamper, coinbaser, value, flags, height, data, ntime):
|
|
super(CoinbaseTransactionPOS, self).__init__()
|
|
log.debug("Got to CoinBaseTX")
|
|
#self.extranonce = 0
|
|
|
|
if len(self.extranonce_placeholder) != self.extranonce_size:
|
|
raise Exception("Extranonce placeholder don't match expected length!")
|
|
|
|
tx_in = halfnode.CTxIn()
|
|
tx_in.prevout.hash = 0L
|
|
tx_in.prevout.n = 2**32-1
|
|
tx_in._scriptSig_template = (
|
|
util.ser_number(height) + binascii.unhexlify(flags) + util.ser_number(int(timestamper.time())) + \
|
|
chr(self.extranonce_size),
|
|
util.ser_string(coinbaser.get_coinbase_data() + data)
|
|
)
|
|
|
|
tx_in.scriptSig = tx_in._scriptSig_template[0] + self.extranonce_placeholder + tx_in._scriptSig_template[1]
|
|
|
|
tx_out = halfnode.CTxOut()
|
|
tx_out.nValue = value
|
|
tx_out.scriptPubKey = coinbaser.get_script_pubkey()
|
|
|
|
self.nTime = ntime
|
|
if settings.COINDAEMON_SHA256_TX == 'yes':
|
|
self.strTxComment = "RanchiMall mining"
|
|
self.vin.append(tx_in)
|
|
self.vout.append(tx_out)
|
|
|
|
# Two parts of serialized coinbase, just put part1 + extranonce + part2 to have final serialized tx
|
|
self._serialized = super(CoinbaseTransactionPOS, self).serialize().split(self.extranonce_placeholder)
|
|
|
|
def set_extranonce(self, extranonce):
|
|
if len(extranonce) != self.extranonce_size:
|
|
raise Exception("Incorrect extranonce size")
|
|
|
|
(part1, part2) = self.vin[0]._scriptSig_template
|
|
self.vin[0].scriptSig = part1 + extranonce + part2
|
|
#else:
|
|
class CoinbaseTransaction(halfnode.CTransaction):
|
|
'''Construct special transaction used for coinbase tx.
|
|
It also implements quick serialization using pre-cached
|
|
scriptSig template.'''
|
|
|
|
extranonce_type = '>Q'
|
|
extranonce_placeholder = struct.pack(extranonce_type, int('f000000ff111111f', 16))
|
|
extranonce_size = struct.calcsize(extranonce_type)
|
|
|
|
def __init__(self, timestamper, coinbaser, value, flags, height, data, ntime):
|
|
super(CoinbaseTransaction, self).__init__()
|
|
log.debug("Got to CoinBaseTX")
|
|
#self.extranonce = 0
|
|
|
|
if len(self.extranonce_placeholder) != self.extranonce_size:
|
|
raise Exception("Extranonce placeholder don't match expected length!")
|
|
|
|
tx_in = halfnode.CTxIn()
|
|
tx_in.prevout.hash = 0L
|
|
tx_in.prevout.n = 2**32-1
|
|
tx_in._scriptSig_template = (
|
|
util.ser_number(height) + binascii.unhexlify(flags) + util.ser_number(int(timestamper.time())) + \
|
|
chr(self.extranonce_size),
|
|
util.ser_string(coinbaser.get_coinbase_data() + data)
|
|
)
|
|
|
|
tx_in.scriptSig = tx_in._scriptSig_template[0] + self.extranonce_placeholder + tx_in._scriptSig_template[1]
|
|
|
|
tx_out = halfnode.CTxOut()
|
|
tx_out.nValue = value
|
|
tx_out.scriptPubKey = coinbaser.get_script_pubkey()
|
|
|
|
self.nTime = ntime
|
|
self.vin.append(tx_in)
|
|
self.vout.append(tx_out)
|
|
|
|
# Two parts of serialized coinbase, just put part1 + extranonce + part2 to have final serialized tx
|
|
self._serialized = super(CoinbaseTransaction, self).serialize().split(self.extranonce_placeholder)
|
|
|
|
def set_extranonce(self, extranonce):
|
|
if len(extranonce) != self.extranonce_size:
|
|
raise Exception("Incorrect extranonce size")
|
|
|
|
(part1, part2) = self.vin[0]._scriptSig_template
|
|
self.vin[0].scriptSig = part1 + extranonce + part2
|