コード例 #1
0
    def get_certificates(self,
                         name,
                         private_key_accounts=None,
                         exclude_without_key=False):
        txos = yield self.db.runQuery(
            """
            SELECT tx.txid, txo.position, txo.claim_id
            FROM txo JOIN tx ON tx.txid=txo.txid
            WHERE claim_name=? AND (is_claim OR is_update)
            GROUP BY txo.claim_id ORDER BY tx.height DESC;
            """, (name, ))

        certificates = []
        # Lookup private keys for each certificate.
        if private_key_accounts is not None:
            for txid, nout, claim_id in txos:
                for account in private_key_accounts:
                    private_key = account.get_certificate_private_key(
                        TXORef(TXRefImmutable.from_id(txid), nout))
                    certificates.append(
                        Certificate(txid, nout, claim_id, name, private_key))

        if exclude_without_key:
            defer.returnValue(
                [c for c in certificates if c.private_key is not None])

        defer.returnValue(certificates)
コード例 #2
0
 def get_claim(self, account, claim_id=None, txid=None, nout=None):
     if claim_id is not None:
         filter_sql = "claim_id=?"
         filter_value = (claim_id, )
     else:
         filter_sql = "txo.txid=? AND txo.position=?"
         filter_value = (txid, nout)
     utxos = yield self.db.runQuery(
         """
         SELECT amount, script, txo.txid, txo.position, account
         FROM txo
             JOIN tx ON tx.txid=txo.txid
             JOIN pubkey_address ON pubkey_address.address=txo.address
         WHERE {}
           AND (is_claim OR is_update)
           AND txoid NOT IN (SELECT txoid FROM txi)
         ORDER BY tx.height DESC, tx.position ASC LIMIT 1;
         """.format(filter_sql), filter_value)
     output_class = account.ledger.transaction_class.output_class
     account_id = account.public_key.address
     return [
         output_class(values[0],
                      output_class.script_class(values[1]),
                      TXRefImmutable.from_id(values[2]),
                      position=values[3],
                      is_change=False,
                      is_my_account=values[4] == account_id)
         for values in utxos
     ]
コード例 #3
0
 def deserialize_from(cls, stream):
     tx_ref = TXRefImmutable.from_hash(stream.read(32))
     position = stream.read_uint32()
     script = stream.read_string()
     sequence = stream.read_uint32()
     return cls(TXORef(tx_ref, position),
                cls.script_class(script) if not tx_ref.is_null else script,
                sequence)
コード例 #4
0
ファイル: basedatabase.py プロジェクト: kodxana/torba
 def get_utxos_for_account(self, account, **constraints):
     constraints['account'] = account.public_key.address
     utxos = yield self.run_query(
         """
         SELECT amount, script, txid, txo.position
         FROM txo JOIN pubkey_address ON pubkey_address.address=txo.address
         WHERE account=:account AND txo.is_reserved=0 AND txoid NOT IN (SELECT txoid FROM txi)
         """ + constraints_to_sql(constraints), constraints)
     output_class = account.ledger.transaction_class.output_class
     defer.returnValue([
         output_class(values[0],
                      output_class.script_class(values[1]),
                      TXRefImmutable.from_id(values[2]),
                      position=values[3]) for values in utxos
     ])
コード例 #5
0
 def get_claim(self, account, claim_id):
     utxos = yield self.db.runQuery(
         """
         SELECT amount, script, txo.txid, position
         FROM txo JOIN tx ON tx.txid=txo.txid
         WHERE claim_id=? AND (is_claim OR is_update) AND txoid NOT IN (SELECT txoid FROM txi)
         ORDER BY tx.height DESC LIMIT 1;
         """, (claim_id, ))
     output_class = account.ledger.transaction_class.output_class
     defer.returnValue([
         output_class(values[0],
                      output_class.script_class(values[1]),
                      TXRefImmutable.from_id(values[2]),
                      position=values[3]) for values in utxos
     ])
コード例 #6
0
 async def get_txos(self, my_account=None, **constraints):
     my_account = my_account or constraints.get('account', None)
     if isinstance(my_account, BaseAccount):
         my_account = my_account.public_key.address
     rows = await self.select_txos(
         "amount, script, txid, tx.height, txo.position, chain, account",
         **constraints)
     output_class = self.ledger.transaction_class.output_class
     return [
         output_class(amount=row[0],
                      script=output_class.script_class(row[1]),
                      tx_ref=TXRefImmutable.from_id(row[2], row[3]),
                      position=row[4],
                      is_change=row[5] == 1,
                      is_my_account=row[6] == my_account) for row in rows
     ]
コード例 #7
0
 def get_claims(self, account):
     utxos = yield self.db.runQuery(
         """
         SELECT amount, script, txo.txid, txo.position
         FROM txo
             JOIN tx ON tx.txid=txo.txid
             JOIN pubkey_address ON pubkey_address.address=txo.address
         WHERE (is_claim OR is_update)
           AND txoid NOT IN (SELECT txoid FROM txi)
           AND account = :account
         ORDER BY tx.height DESC, tx.position ASC;
         """, {'account': account.public_key.address})
     output_class = account.ledger.transaction_class.output_class
     return [
         output_class(values[0],
                      output_class.script_class(values[1]),
                      TXRefImmutable.from_id(values[2]),
                      position=values[3],
                      is_change=False,
                      is_my_account=True) for values in utxos
     ]
コード例 #8
0
    def get_certificates(self,
                         name=None,
                         channel_id=None,
                         private_key_accounts=None,
                         exclude_without_key=False):
        if name is not None:
            filter_sql = 'claim_name=?'
            filter_value = name
        elif channel_id is not None:
            filter_sql = 'claim_id=?'
            filter_value = channel_id
        else:
            raise ValueError("'name' or 'claim_id' is required")

        txos = yield self.db.runQuery(
            """
            SELECT tx.txid, txo.position, txo.claim_id
            FROM txo JOIN tx ON tx.txid=txo.txid
            WHERE {} AND (is_claim OR is_update)
            GROUP BY txo.claim_id ORDER BY tx.height DESC, tx.position ASC;
            """.format(filter_sql), (filter_value, ))

        certificates = []
        # Lookup private keys for each certificate.
        if private_key_accounts is not None:
            for txid, nout, claim_id in txos:
                for account in private_key_accounts:
                    private_key = account.get_certificate_private_key(
                        TXORef(TXRefImmutable.from_id(txid), nout))
                    certificates.append(
                        Certificate(txid, nout, claim_id, name, private_key))

        if exclude_without_key:
            return [c for c in certificates if c.private_key is not None]

        return certificates