예제 #1
0
    def test_state_tx(self):
        ms = MemoryStream(binascii.unhexlify(self.sttx))

        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)

        # the net_fee calculation in short is : net_fee = inputs - outputs -system fee.
        # For this test to be able to grab the input values we need to make the TX that it references available for this test
        ms2 = MemoryStream(binascii.unhexlify(
            b'80000001def3ab1c73a13e80fea34ca751c79fe8dcf68d93d91d4956818baf0b99d95818010002e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c6000e8764817000000faaa0f339e0fb33f91697cbf5aac41d17921222ae72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c60008997b2270000002d9a070d388aa24d9f639bc8ddf985dc473c75d70141401a07d186fdfe3f9862c873d7cd9bdcb9cc8b3f5edcf853af31addcc4476d7d4fe89385cc955a4f604c667110332c14cb2fd8f62a29569b01a572774c7f7136572321026aeca2aed2094e9622a44cf584c694554f10cdb84d4f8eeab3e28ead4e87c168ac'))
        reader2 = BinaryReader(ms2)
        vout_tx = Transaction.DeserializeFrom(reader2)

        self.assertEqual(tx.ToArray(), self.sttx)
        self.assertEqual(tx.Hash.ToBytes(), self.sttx_id)

        with patch('neo.Core.Blockchain.Blockchain.GetTransaction', return_value=(vout_tx, 0)):
            json = tx.ToJson()
        self.assertEqual(json['size'], 191)
        self.assertEqual(json['type'], "StateTransaction")
        self.assertEqual(json['version'], 0)
        self.assertEqual(len(json['attributes']), 0)
        self.assertEqual(len(json['vout']), 0)
        self.assertEqual(len(json['vin']), 1)
        self.assertEqual(json['sys_fee'], "1000")
        self.assertEqual(json['net_fee'], "0")

        descriptors = json['descriptors'][0]
        self.assertEqual(descriptors['type'], "Validator")
        self.assertEqual(descriptors['key'], "025bdf3f181f53e9696227843950deb72dcd374ded17c057159513c3d0abe20b64")
        self.assertEqual(descriptors['field'], "Registered")
        self.assertEqual(descriptors['value'], "01")
예제 #2
0
    def test_tx_deserialize(self):

        ms = MemoryStream(self.tx_raw_hex)

        reader = BinaryReader(ms)

        tx = Transaction.DeserializeFrom(reader)

        self.assertEqual(type(tx), MinerTransaction )

        self.assertEqual(tx.Hash.ToBytes(), self.tx_id)

        self.assertEqual(tx.Nonce, self.tx_nonce)

        self.assertEqual(tx.inputs, [])
        self.assertEqual(tx.outputs, [])
        self.assertEqual(tx.scripts, [])


        ms = MemoryStream()
        writer = BinaryWriter(ms)

        tx.Serialize(writer)
        out = ms.ToArray()

        self.assertEqual(out, self.tx_raw)


        json = tx.ToJson()
        self.assertEqual(json['nonce'], self.tx_nonce)
예제 #3
0
def get_tx_data(tx):
    ms = MemoryStream()
    w = BinaryWriter(ms)
    tx.SerializeUnsigned(w)
    ms.flush()
    tx_data = ms.ToArray().decode()
    return tx_data
    def FromJson(jsn, isMultiSig=True):
        try:
            parsed = json.loads(jsn)
            if parsed['type'] == 'Neo.Core.ContractTransaction':
                verifiable = ContractTransaction()
                ms = MemoryStream(binascii.unhexlify(parsed['hex']))
                r = BinaryReader(ms)
                verifiable.DeserializeUnsigned(r)
                context = ContractParametersContext(verifiable,
                                                    isMultiSig=isMultiSig)
                for key, value in parsed['items'].items():
                    if "0x" in key:
                        key = key[2:]
                    key = key.encode()
                    parameterbytes = []
                    for pt in value['parameters']:
                        if pt['type'] == 'Signature':
                            parameterbytes.append(0)
                    contract = Contract.Create(value['script'], parameterbytes,
                                               key)
                    context.ContextItems[key] = ContextItem(contract)
                    if 'signatures' in value:
                        context.ContextItems[key].Signatures = value[
                            'signatures']

                return context
            else:
                raise ("Unsupported transaction type in JSON")

        except Exception as e:
            logger.error(
                "Failed to import ContractParametersContext from JSON: {}".
                format(e))
    def AddSignature(self, contract, pubkey, signature):

        if contract.Type == ContractType.MultiSigContract:

            item = self.CreateItem(contract)
            if item is None:
                return False
            for p in item.ContractParameters:
                if p.Value is not None:
                    return False
            if item.Signatures is None:
                item.Signatures = {}
            elif pubkey.encode_point(True) in item.Signatures:
                return False

            ecdsa = ECDSA.secp256r1()
            points = []
            temp = binascii.unhexlify(contract.Script)
            ms = MemoryStream(binascii.unhexlify(contract.Script))
            reader = BinaryReader(ms)
            numr = reader.ReadUInt8()
            while reader.ReadUInt8() == 33:
                ecpoint = ecdsa.ec.decode_from_hex(
                    binascii.hexlify(reader.ReadBytes(33)).decode())
                points.append(ecpoint)
            ms.close()

            if pubkey not in points:
                return False

            item.Signatures[pubkey.encode_point(
                True).decode()] = binascii.hexlify(signature)

            if len(item.Signatures) == len(contract.ParameterList):

                i = 0
                points.sort(reverse=True)
                for k in points:
                    pubkey = k.encode_point(True).decode()
                    if pubkey in item.Signatures:
                        if self.Add(contract, i,
                                    item.Signatures[pubkey]) is None:
                            raise Exception("Invalid operation")
                        i += 1
                item.Signatures = None
            return True

        else:
            index = -1
            if contract.ParameterList == '00':
                contract.ParameterList = b'\x00'
            length = len(contract.ParameterList)
            for i in range(0, length):
                if ContractParameterType(contract.ParameterList[i]
                                         ) == ContractParameterType.Signature:
                    if index >= 0:
                        raise Exception("Signature must be first")
                    else:
                        index = i
            return self.Add(contract, index, signature)
예제 #6
0
    def test_yet_another_tx(self):
        ms = MemoryStream(binascii.unhexlify(self.yatx))

        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)
        self.assertEqual(tx.ToArray(), self.yatx)
        self.assertEqual(tx.Hash.ToBytes(), self.yatx_id)
예제 #7
0
    def test_miner_tx(self):
        ms = MemoryStream(binascii.unhexlify(self.mr))

        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)
        self.assertEqual(tx.Nonce, self.mrn)
        self.assertEqual(tx.ToArray(), self.mr)
        self.assertEqual(tx.Hash.ToBytes(), self.mrh)
예제 #8
0
    def test_contract_tx_again(self):
        ms = MemoryStream(binascii.unhexlify(self.cr))

        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)

        self.assertEqual(tx.ToArray(), self.cr)
        self.assertEqual(tx.Hash.ToBytes(), self.crid)
예제 #9
0
    def ToArray( value ):

        ms = MemoryStream()
        writer = BinaryWriter(ms)

        value.Serialize(writer)
        ms.flush()
        return ms.ToArray()
예제 #10
0
    def test_invocation_transaction(self):
        ms = MemoryStream(binascii.unhexlify(self.ir))

        reader = BinaryReader(ms)

        tx = Transaction.DeserializeFrom(reader)
        self.assertEqual(tx.ToArray(), self.ir)
        self.assertEqual(tx.Hash.ToBytes(), self.ir_id)
예제 #11
0
    def test_pub_two(self):
        ms = MemoryStream(binascii.unhexlify(self.p2))

        reader = BinaryReader(ms)

        tx = Transaction.DeserializeFrom(reader)

        self.assertEqual(tx.ToArray(), self.p2)
        self.assertEqual(tx.Hash.ToBytes(), self.p2id)
예제 #12
0
    def test_enrollment_tx(self):

        ms = MemoryStream(binascii.unhexlify(self.eraw))

        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)

        self.assertEqual(tx.ToArray(), self.eraw)
        self.assertEqual(tx.Hash.ToBytes(), self.eid)
예제 #13
0
    def Trim(self):
        ms = MemoryStream()
        writer = BinaryWriter(ms)

        self.SerializeUnsigned(writer)
        writer.WriteByte(1)
        self.Script.serialize(writer)
        writer.WriteSerializableArray([tx.Hash() for tx in self.Transactions])
        ms.flush()
        return ms.ToArray()
예제 #14
0
    def test_enrollment_tx(self):
        ms = MemoryStream(binascii.unhexlify(self.eraw))

        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)

        self.assertEqual(tx.ToArray(), self.eraw)
        self.assertEqual(tx.Hash.ToBytes(), self.eid)
        self.assertEqual(
            Fixed8.FromDecimal(settings.ALL_FEES['EnrollmentTransaction']),
            tx.SystemFee())
예제 #15
0
    def test_GetScriptHashesForVerifying_neo_gas(self):
        # test a raw tx using neo
        ms = MemoryStream(binascii.unhexlify(self.ntx))
        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)
        tx.raw_tx = True

        res = tx.GetScriptHashesForVerifying()

        self.assertTrue(type(res), list)

        # test a raw tx using gas
        ms = MemoryStream(binascii.unhexlify(self.gtx))
        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)
        tx.raw_tx = True

        res = tx.GetScriptHashesForVerifying()

        self.assertTrue(type(res), list)
예제 #16
0
    def GetHashData(self):
        """
        Get the hashable data.

        Returns:
            bytes:
        """
        ms = MemoryStream()
        w = BinaryWriter(ms)
        self.SerializeUnsigned(w)
        ms.flush()
        return ms.ToArray()
예제 #17
0
    def test_GetScriptHashesForVerifying_invalid_operation(self):
        # test a normal tx with a bad assetId
        ms = MemoryStream(binascii.unhexlify(self.rtx))
        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)

        with self.assertRaises(Exception) as e:
            tx.GetScriptHashesForVerifying()

        self.assertTrue("Invalid operation" in str(e.exception))

        # test a raw tx with a bad assetId
        ms = MemoryStream(binascii.unhexlify(self.rtx))
        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)
        tx.raw_tx = True

        with self.assertRaises(Exception) as e:
            tx.GetScriptHashesForVerifying()

        self.assertTrue("Invalid operation" in str(e.exception))
예제 #18
0
    def test_contract_tx_deserialize(self):
        ms = MemoryStream(binascii.unhexlify(self.ctx_raw))

        reader = BinaryReader(ms)

        tx = Transaction.DeserializeFrom(reader)

        self.assertEqual(tx.ToArray(), self.ctx_raw)
        self.assertEqual(tx.Hash.ToBytes(), self.ctx_id)

        json = tx.ToJson()
        self.assertEqual(json['size'], 605)
        self.assertEqual(json['type'], 'ContractTransaction')
예제 #19
0
    def test_pub_two(self):
        ms = MemoryStream(binascii.unhexlify(self.p2))

        reader = BinaryReader(ms)

        tx = Transaction.DeserializeFrom(reader)

        self.assertEqual(tx.ToArray(), self.p2)
        self.assertEqual(tx.Hash.ToBytes(), self.p2id)

        json = tx.ToJson()
        self.assertEqual(json['size'], 402)
        self.assertEqual(json['type'], 'PublishTransaction')
예제 #20
0
    def test_register_tx(self):

        ms = MemoryStream(binascii.unhexlify(self.rr))

        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)
        self.assertEqual(self.rrid, tx.Hash.ToBytes())

        json = tx.ToJson()
        asset = json['asset']

        self.assertEqual(asset['admin'], 'ARFe4mTKRTETerRoMsyzBXoPt2EKBvBXFX')
        self.assertEqual(asset['name'], '[{"lang":"zh-CN","name":"TestCoin"}]')
        self.assertEqual(asset['precision'], 8)
예제 #21
0
    def FromTrimmedData(bytes, index, transaction_method):
        block = Block()
        ms = MemoryStream()
        reader = BinaryReader(ms)

        block.DeserializeUnsigned(reader)
        reader.ReadByte()
        block.Script = reader.ReadSerializableArray('neo.Core.Witness.Witness')
        block.Transactions = []
        for i in range(0, reader.ReadVarInt()):
            tx = Transaction.DeserializeFrom(reader)
            block.Transactions.append(tx)

        return block
예제 #22
0
    def test_message_serialization(self):

        message = Message('version', payload=self.payload)

        self.assertEqual(message.Command, 'version')

        ms = MemoryStream()
        writer = BinaryWriter(ms)

        message.Serialize(writer)
        ms.flush()
        result = binascii.unhexlify(ms.ToArray())

        ms = MemoryStream(result)
        reader = BinaryReader(ms)

        deserialized_message = Message()
        deserialized_message.Deserialize(reader)

        dm = deserialized_message

        self.assertEqual(dm.Command, 'version')

        self.assertEqual(dm.Magic, Settings.MAGIC)

        checksum = Message.GetChecksum(dm.Payload)

        self.assertEqual(checksum, dm.Checksum)

        deserialized_version = IOHelper.AsSerializableWithType(
            dm.Payload, 'neo.Network.Payloads.VersionPayload.VersionPayload')

        self.assertEqual(deserialized_version.Port, self.port)
        self.assertEqual(deserialized_version.UserAgent, self.ua)

        self.assertEqual(deserialized_version.Timestamp,
                         self.payload.Timestamp)
예제 #23
0
    def FromTrimmedData(data, index):

        header = Header()

        ms = MemoryStream(data)

        reader = BinaryReader(ms)

        header.DeserializeUnsigned(reader)
        reader.ReadByte()

        witness = Witness()
        witness.Deserialize(reader)
        header.Script = witness

        return header
예제 #24
0
    def test_verify_exceeds_max_tx_size(self):
        ms = MemoryStream(binascii.unhexlify(self.vvtx))
        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)
        tx._network_fee = Fixed8.FromDecimal(0.001)

        self.assertEqual(tx.ToArray(), self.vvtx)
        self.assertEqual(tx.Hash.ToBytes(), self.vvtx_id)

        snapshot = GetBlockchain()._db.createSnapshot()

        with patch("neo.Core.TX.Transaction.Transaction.Size", return_value=(Transaction.MAX_TX_SIZE + 1)):
            res = tx.Verify(snapshot, [tx])
            self.assertFalse(res)

            tx_size = tx.Size()
            self.assertGreater(tx_size, Transaction.MAX_TX_SIZE)
예제 #25
0
    def test_verify_claim_tx_high_priority(self):
        ms = MemoryStream(binascii.unhexlify(self.cltx))
        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)

        self.assertEqual(tx.ToArray(), self.cltx)
        self.assertEqual(tx.Hash.ToBytes(), self.cltx_id)
        snapshot = GetBlockchain()._db.createSnapshot()

        with patch("neo.Core.TX.Transaction.Transaction.Size", return_value=(settings.MAX_FREE_TX_SIZE + 1)):
            with patch('neo.SmartContract.Helper.Helper.VerifyWitnesses', return_value=True):  # we are not testing VerifyScripts
                with patch('neo.Core.Blockchain.Blockchain.CalculateBonusIgnoreClaimed', return_value=Fixed8.FromDecimal(0.30551243)):
                    res = tx.Verify(snapshot, [tx])
                    self.assertTrue(res)

                    tx_size = tx.Size()
                    self.assertGreater(tx_size, settings.MAX_FREE_TX_SIZE)
    def ToJson(self):
        jsn = {}
        jsn['type'] = 'Neo.Core.ContractTransaction'  # Verifiable.GetType().FullName
        ms = MemoryStream()
        w = BinaryWriter(ms)
        self.Verifiable.SerializeUnsigned(w)
        ms.flush()
        jsn['hex'] = ms.ToArray().decode()
        jsn['items'] = {}
        for key, value in self.ContextItems.items():
            if type(key) == str:
                shkey = "0x{}".format(key)
            else:
                shkey = "0x{}".format(key.decode())
            jsn['items'][shkey] = value.ToJson()

        return jsn
예제 #27
0
    def test_GetScriptHashesForVerifying_DutyFlag(self):
        # test a raw tx
        ms = MemoryStream(binascii.unhexlify(self.rtx))
        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)
        tx.raw_tx = True

        # create the mocked asset
        mock_asset = AssetState()
        mock_asset.AssetType = 0x80

        snapshot = GetBlockchain()._db.createSnapshot()
        with patch("neo.Core.Helper.Helper.StaticAssetState", return_value=mock_asset):
            res = tx.GetScriptHashesForVerifying(snapshot)

        self.assertTrue(type(res), list)
        self.assertEqual(res[0], Helper.AddrStrToScriptHash("AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3"))
예제 #28
0
    def ImportFromArray(self, raw_tx):
        """
        Import a raw transaction from an array.

        Args:
            raw_tx: (bytes) the raw transaction array
        """
        if not isinstance(raw_tx, bytes):
            raise TypeError('Please input a byte array.')

        try:
            raw_tx = binascii.unhexlify(raw_tx)
            ms = MemoryStream(raw_tx)
            reader = BinaryReader(ms)
            self.DeserializeFrom(reader)
        except Exception as e:
            raise FormatError(
                f'Unable to import raw transaction.\nError output: {e}')
예제 #29
0
    def test_publish_tx_deserialize(self):

        ms = MemoryStream(binascii.unhexlify(self.pb_raw))

        reader = BinaryReader(ms)

        tx = Transaction.DeserializeFrom(reader)
        self.assertEqual(tx.ToArray(), self.pb_raw)
        self.assertEqual(tx.Hash.ToBytes(), self.pb_hash)

        json = tx.ToJson()

        contract = json['contract']
        self.assertEqual(contract['author'], 'Erik Zhang')
        self.assertEqual(contract['description'], 'Lock your assets until a timestamp.')

        self.assertEqual(contract['code']['hash'], 'ffbd1a7ad1e2348b6b3822426f364bfb4bcce3b9')
        self.assertEqual(contract['code']['returntype'], 1)
        self.assertEqual(contract['code']['parameters'], '020500')
예제 #30
0
    def test_claim_tx(self):
        ms = MemoryStream(binascii.unhexlify(self.cltx))

        reader = BinaryReader(ms)
        tx = Transaction.DeserializeFrom(reader)
        self.assertEqual(tx.ToArray(), self.cltx)
        self.assertEqual(tx.Hash.ToBytes(), self.cltx_id)

        json = tx.ToJson()
        self.assertEqual(json['size'], 577)
        self.assertEqual(json['type'], "ClaimTransaction")
        self.assertEqual(json['version'], 0)
        self.assertEqual(len(json['attributes']), 0)
        self.assertEqual(len(json['vout']), 1)
        self.assertEqual(len(json['vin']), 0)
        self.assertEqual(json['sys_fee'], "0")
        self.assertEqual(json['net_fee'], "0")

        self.assertEqual(len(json['claims']), 12)