Beispiel #1
0
    def create_inputs(self, numinputs, txsize):
        idx = 0
        sum = 0
        self.inputs = []
        self.txs = {}
        for nr in range(numinputs):
            t = proto_types.TransactionType()
            t.version = 1
            t.lock_time = 0
            i = t.inputs.add()
            i.prev_hash = os.urandom(32)
            i.prev_index = random.randint(0,4)
            i.script_sig = os.urandom(100)
            i.sequence = 0xffffffff
            if (nr % 50 == 0):
                print(nr)
            myout = random.randint(0, txsize-1)
            segwit = 1 #random.randint(0,1)
            for vout in range(txsize):
                o = t.bin_outputs.add()
                o.amount = random.randint(10000,1000000)
                if vout == myout:
                    amount = o.amount
                    sum = sum + o.amount
                    node = self.node
                    path = [0, idx]
                    node = bip32.public_ckd(node, path)
                    idx = idx + 1
                    pubkey = tools.hash_160(node.public_key)
                else:
                    pubkey = os.urandom(20)
                if (segwit):
                    o.script_pubkey = binascii.unhexlify('0014') + pubkey
                else:
                    o.script_pubkey = binascii.unhexlify('76a914') + pubkey + binascii.unhexlify('88ac')

            txser = self.serialize_tx(t)
            txhash = tools.Hash(txser)[::-1]
            if (segwit):
                outi = self.inputs.append(
                    proto_types.TxInputType(
                        address_n=self.client.expand_path("44'/0'/0'/0/"+str(idx)),
                        script_type = proto_types.SPENDWADDRESS,
                        prev_hash=txhash,
                        prev_index = myout,
                        amount = amount
                    ))
            else:
                outi = self.inputs.append(
                    proto_types.TxInputType(
                        address_n=self.client.expand_path("44'/0'/0'/0/"+str(idx)),
                        script_type = proto_types.SPENDADDRESS,
                        prev_hash=txhash,
                        prev_index = myout
                    ))
            #print(binascii.hexlify(txser))
            #print(binascii.hexlify(txhash))
            self.txs[binascii.hexlify(txhash)] = t

        self.outputs = [
            proto_types.TxOutputType(
                amount=sum,
                script_type=proto_types.PAYTOADDRESS,
                address_n=self.client.expand_path("44'/0'/0'/1/0")
            )]
    def create_inputs(self, numinputs, txsize):
        idx = 0
        sum = 0
        self.inputs = []
        self.txs = {}
        for nr in range(numinputs):
            t = proto_types.TransactionType()
            t.version = 1
            t.lock_time = 0
            i = t.inputs.add()
            i.prev_hash = os.urandom(32)
            i.prev_index = random.randint(0, 4)
            i.script_sig = os.urandom(100)
            i.sequence = 0xffffffff
            if nr % 50 == 0:
                print(nr)
            myout = random.randint(0, txsize - 1)
            segwit = random.randint(0, 2)
            for vout in range(txsize):
                o = t.bin_outputs.add()
                o.amount = random.randint(10000, 1000000)
                if vout == myout:
                    amount = o.amount
                    sum = sum + o.amount
                    node = self.node
                    path = [0, idx]
                    node = bip32.public_ckd(node, path)
                    idx = idx + 1
                    pubkey = tools.hash_160(node.public_key)
                else:
                    pubkey = os.urandom(20)
                if segwit == 2:
                    # p2sh segwit
                    o.script_pubkey = b'\xa9\x14' + hash160(b'\x00\x14' +
                                                            pubkey) + b'\x87'
                elif segwit == 1:
                    o.script_pubkey = b'\x00\x14' + pubkey
                else:
                    o.script_pubkey = b'\x76\xa9\x14' + pubkey + b'\x88\xac'

            txser = self.serialize_tx(t)
            txhash = tools.Hash(txser)[::-1]
            outi = self.inputs.append(
                proto_types.TxInputType(
                    address_n=self.client.expand_path("44'/0'/0'/0/%d" % idx),
                    script_type=(proto_types.SPENDWITNESS if segwit == 1 else
                                 proto_types.SPENDP2SHWITNESS
                                 if segwit == 2 else proto_types.SPENDADDRESS),
                    prev_hash=txhash,
                    prev_index=myout,
                    amount=amount if segwit > 0 else 0))
            # print(binascii.hexlify(txser))
            # print(binascii.hexlify(txhash))
            self.txs[binascii.hexlify(txhash)] = t

        self.outputs = [
            proto_types.TxOutputType(
                amount=sum,
                script_type=proto_types.PAYTOADDRESS,
                address_n=self.client.expand_path("44'/0'/0'/1/0"))
        ]
	depth=0, 
	fingerprint=0,
	child_num=0,
	chain_code=binascii.unhexlify('2fb77e25cd3e2e034bcbafa1f81ec7e4caf927b06c87db296f1186208315525e'),
	public_key=binascii.unhexlify('03f645ec6544a92f951f3bca16a2bc1c56846d065594db222725d59b9902528385')
)
dummyhdnodepath = types.HDNodePathType(
	node=dummyhdnode,
	address_n=[0x0000004c, 0x00000033, 0x0000001E, 0x00000002]
)

dummyMultisig = types.MultisigRedeemScriptType(
	pubkeys=[dummyhdnodepath],
	m=1)

msg = types.TransactionType()
testInput = types.TxInputType(
	address_n=[0x8000004c, 0x80000033, 0x8000001E, 0x00000001],
	prev_hash=binascii.unhexlify('bca17fb40c8c86e7c7acd0d3749af9e5c66575dce86db895b7e3301f7a4b2b84'),
	prev_index=1,
	script_sig=binascii.unhexlify('76a91440afc69e46643de1908c8988ad62214270006c3b88ac'),
	script_type=types.SPENDMULTISIG,
	multisig=dummyMultisig
)
msg.inputs.extend([ testInput ])

res = client.call(proto.TxAck(tx = msg))

if isinstance(res, proto.Failure):
    raise CallException("Signing failed")