Пример #1
0
    def deserialize(self):
        starting_position = int(self.asset_offset / 2)

        hash_function = read_bit8(self.serialized, starting_position) & 0xff
        ipfs_hash_length = read_bit8(self.serialized, starting_position + 1) & 0xff

        start_index = (starting_position + 2) * 2
        end_index = start_index + (ipfs_hash_length * 2)
        ipfs_hash = hexlify(self.serialized)[start_index:end_index]

        temp_buffer = bytes()

        temp_buffer += write_bit8(hash_function)
        temp_buffer += write_bit8(ipfs_hash_length)
        temp_buffer += unhexlify(ipfs_hash)

        self.transaction.asset = {
            'ipfs': b58encode(temp_buffer).decode()
        }

        self.transaction.parse_signatures(
            hexlify(self.serialized).decode(),
            self.asset_offset + (ipfs_hash_length + 2) * 2
        )

        return self.transaction
Пример #2
0
    def serialize(self):
        """Perform AIP11 compliant serialization

        Returns:
            bytes: bytes string
        """
        network_config = get_network()
        bytes_data = bytes()
        bytes_data += write_bit8(0xff)
        bytes_data += write_low(self.transaction.get('version') or 0x01)
        bytes_data += write_bit8(self.transaction.get('network') or network_config['version'])
        bytes_data += write_low(self.transaction['type'])
        bytes_data += write_bit32(self.transaction['timestamp'])
        bytes_data += write_high(self.transaction['senderPublicKey'])
        bytes_data += write_bit64(self.transaction['fee'])

        if self.transaction.get('vendorField'):
            vendorFieldLength = len(self.transaction['vendorField'])
            bytes_data += write_bit8(vendorFieldLength)
            bytes_data += self.transaction['vendorField']
        elif self.transaction.get('vendorFieldHex'):
            vendorField_hex_length = len(self.transaction['vendorFieldHex'])
            bytes_data += write_bit8(vendorField_hex_length / 2)
            bytes_data += self.transaction['vendorFieldHex']
        else:
            bytes_data += write_bit8(0x00)

        bytes_data = self._handle_transaction_type(bytes_data)
        bytes_data = self._handle_signature(bytes_data)

        return hexlify(bytes_data).decode()
    def serialize(self):
        public_keys_length = len(
            self.transaction['asset']['multiSignature']['publicKeys'])
        self.bytes_data += write_bit8(
            self.transaction['asset']['multiSignature']['min'])
        self.bytes_data += write_bit8(public_keys_length)
        for key in self.transaction['asset']['multiSignature']['publicKeys']:
            self.bytes_data += unhexlify(key.encode())

        return self.bytes_data
Пример #4
0
 def serialize(self):
     keysgroup = []
     if self.transaction.get('version') is None or self.transaction['version'] == 1:
         for key in self.transaction['asset']['multisignature']['keysgroup']:
             keysgroup.append(key[1::] if key.startswith('+') else key)
     else:
         keysgroup = self.transaction['asset']['multisignature']['keysgroup']
     self.bytes_data += write_bit8(self.transaction['asset']['multisignature']['min'])
     self.bytes_data += write_bit8(len(self.transaction['asset']['multisignature']['keysgroup']))
     self.bytes_data += write_bit8(self.transaction['asset']['multisignature']['lifetime'])
     self.bytes_data += unhexlify(''.join(keysgroup))
     return self.bytes_data
Пример #5
0
    def to_bytes(self, skip_signature=True, skip_second_signature=True):
        """Convert the transaction to its byte representation

        Args:
            skip_signature (bool, optional): do you want to skip the signature
            skip_second_signature (bool, optional): do you want to skip the 2nd signature

        Returns:
            bytes: bytes representation of the transaction
        """
        bytes_data = bytes()
        bytes_data += write_bit8(self.type)
        bytes_data += write_bit32(self.timestamp)
        bytes_data += write_high(self.senderPublicKey)

        if self.recipientId:
            bytes_data += b58decode_check(self.recipientId)
        else:
            bytes_data += pack('21x')

        if self.vendorField and len(self.vendorField) < 64:
            bytes_data += self.vendorField
            bytes_data += pack('{}x'.format(64 - len(self.vendorField)))
        else:
            bytes_data += pack('64x')

        bytes_data += write_bit64(self.amount)
        bytes_data += write_bit64(self.fee)

        bytes_data = self._handle_transaction_type(bytes_data)
        bytes_data = self._handle_signature(bytes_data, skip_signature,
                                            skip_second_signature)

        return bytes_data
Пример #6
0
def wif_from_passphrase(passphrase, network_wif=None):
    """Get wif from passphrase

    Args:
        passphrase (bytes):
        network_wif (int, optional):

    Returns:
        string: wif
    """
    if not network_wif:
        network = get_network()
        network_wif = network['wif']

    private_key = hashlib.sha256(passphrase.encode())
    seed = write_bit8(network_wif) + private_key.digest() + write_bit8(0x01)
    return b58encode_check(seed).decode()
Пример #7
0
    def serialize(self):
        delegate_bytes = hexlify(
            self.transaction['asset']['delegate']['username'].encode())

        self.bytes_data += write_bit8(len(delegate_bytes) // 2)
        self.bytes_data += unhexlify(delegate_bytes)

        return self.bytes_data
Пример #8
0
 def serialize(self):
     vote_bytes = []
     for vote in self.transaction['asset']['votes']:
         if vote.startswith('+'):
             vote_bytes.append('01{}'.format(vote[1::]))
         else:
             vote_bytes.append('00{}'.format(vote[1::]))
     self.bytes_data += write_bit8(len(self.transaction['asset']['votes']))
     self.bytes_data += unhexlify(''.join(vote_bytes))
     return self.bytes_data
Пример #9
0
    def serialize(self):
        self.bytes_data += write_bit64(self.transaction['amount'])
        self.bytes_data += unhexlify(
            self.transaction['asset']['lock']['secretHash'].encode())
        self.bytes_data += write_bit8(
            self.transaction['asset']['lock']['expiration']['type'])
        self.bytes_data += write_bit32(
            self.transaction['asset']['lock']['expiration']['value'])

        recipientId = hexlify(b58decode_check(self.transaction['recipientId']))
        self.bytes_data += write_high(recipientId)

        return self.bytes_data
Пример #10
0
    def _handle_transaction_type(self, bytes_data):
        """Handled each transaction type differently

        Args:
            bytes_data (bytes): input the bytes data to which you want to append new bytes

        Raises:
            NotImplementedError: raised only if the child transaction doesn't implement this
            required method
        """
        if self.type == TRANSACTION_SECOND_SIGNATURE_REGISTRATION:
            public_key = self.asset['signature']['publicKey']
            bytes_data += unhexlify(public_key)
        elif self.type == TRANSACTION_DELEGATE_REGISTRATION:
            bytes_data += self.asset['delegate']['username'].encode()
        elif self.type == TRANSACTION_VOTE:
            bytes_data += ''.join(self.asset['votes']).encode()
        elif self.type == TRANSACTION_MULTI_SIGNATURE_REGISTRATION:
            bytes_data += write_bit8(self.asset['multisignature']['min'])
            bytes_data += write_bit8(self.asset['multisignature']['lifetime'])
            bytes_data += ''.join(
                self.asset['multisignature']['keysgroup']).encode()
        return bytes_data
Пример #11
0
def address_from_public_key(public_key, network_version=None):
    """Get an address from a public key

    Args:
        public_key (str):
        network_version (int, optional):

    Returns:
        bytes:
    """
    if not network_version:
        network = get_network()
        network_version = network['version']

    ripemd160 = hashlib.new('ripemd160', unhexlify(public_key.encode()))
    seed = write_bit8(network_version) + ripemd160.digest()
    return b58encode_check(seed).decode()
Пример #12
0
def address_from_private_key(private_key, network_version=None):
    """Get an address from private key

    Args:
        private_key (string):
        network_version (int, optional):

    Returns:
        TYPE: Description
    """
    if not network_version:
        network = get_network()
        network_version = network['version']

    private_key = PrivateKey.from_hex(private_key)
    ripemd160 = hashlib.new('ripemd160', unhexlify(private_key.public_key))
    seed = write_bit8(network_version) + ripemd160.digest()
    return b58encode_check(seed).decode()
Пример #13
0
    def _handle_signature(self, bytes_data):
        """Serialize signature data of the transaction

        Args:
            bytes_data (bytes): already serialized data

        Returns:
            bytes: bytes string
        """
        if self.transaction.get('signature'):
            bytes_data += unhexlify(self.transaction['signature'])

        if self.transaction.get('secondSignature'):
            bytes_data += unhexlify(self.transaction['secondSignature'])
        elif self.transaction.get('signSignature'):
            bytes_data += unhexlify(self.transaction['signSignature'])

        if self.transaction.get('signatures'):
            bytes_data += write_bit8(0xff)
            bytes_data += unhexlify(''.join(self.transaction['signatures']))

        return bytes_data
Пример #14
0
    def serialize(self,
                  skip_signature=True,
                  skip_second_signature=True,
                  skip_multi_signature=True,
                  raw=False):
        """Perform AIP11 compliant serialization

        Returns:
            bytes: bytes string
        """
        network_config = get_network()
        bytes_data = bytes()

        bytes_data += write_bit8(0xff)

        bytes_data += write_bit8(self.transaction.get('version') or 0x02)
        bytes_data += write_bit8(
            self.transaction.get('network') or network_config['version'])
        bytes_data += write_bit32(self.transaction.get('typeGroup') or 0x01)
        bytes_data += write_bit16(self.transaction.get('type'))
        bytes_data += write_bit64(self.transaction.get('nonce') or 0x01)

        bytes_data += write_high(self.transaction.get('senderPublicKey'))
        bytes_data += write_bit64(self.transaction.get('fee'))

        if self.transaction.get('vendorField'):
            vendorFieldLength = len(self.transaction.get('vendorField'))
            bytes_data += write_bit8(vendorFieldLength)
            bytes_data += self.transaction['vendorField'].encode()
        elif self.transaction.get('vendorFieldHex'):
            vendorField_hex_length = len(self.transaction['vendorFieldHex'])
            bytes_data += write_bit8(vendorField_hex_length / 2)
            bytes_data += self.transaction['vendorFieldHex']
        else:
            bytes_data += write_bit8(0x00)
        bytes_data = self._handle_transaction_type(bytes_data)
        bytes_data = self._handle_signature(bytes_data, skip_signature,
                                            skip_second_signature,
                                            skip_multi_signature)

        return bytes_data if raw else hexlify(bytes_data).decode()
Пример #15
0
 def serialize(self):
     dag = self.transaction['asset']['ipfs']['dag']
     self.bytes_data += write_bit8(len(dag) // 2)
     self.bytes_data += unhexlify(dag)
     return self.bytes_data