From 50901e6bb336bb14c2e9f75d1d77d3fa71572809 Mon Sep 17 00:00:00 2001 From: successli Date: Thu, 21 Jun 2018 17:33:14 +0800 Subject: [PATCH] utxos list divide not mature utxo --- utxo-combiner/Transaction.py | 9 +++--- utxo-combiner/UnspentOutputs.py | 60 ++++++++++++++++++++++++++++++----- utxo-combiner/transaction_test.py | 7 ++-- utxo-combiner/unspent_outputs_test.py | 8 ++++- utxo-combiner/utxo_combiner.py | 55 ++++++++++++++++++++++++++++++++ 5 files changed, 123 insertions(+), 16 deletions(-) create mode 100644 utxo-combiner/utxo_combiner.py diff --git a/utxo-combiner/Transaction.py b/utxo-combiner/Transaction.py index 4060acc..9cf101e 100644 --- a/utxo-combiner/Transaction.py +++ b/utxo-combiner/Transaction.py @@ -55,16 +55,17 @@ class Transaction(object): resp_json = json.loads(response.text) if resp_json['status'] == 'success': - return resp_json['data'] + return resp_json['data'], 1 elif resp_json['status'] == 'fail': - return resp_json['msg'] + return resp_json['msg'], -1 else: - return resp_json + return resp_json, 0 @staticmethod def build_transaction(connection, actions): + # ttl: 15min=900000ms body_json = {"base_transaction": None, "actions": actions, - "ttl": 0, "time_range": 0} + "ttl": 1, "time_range": 0} response = connection.request("/build-transaction", body_json) resp_json = json.loads(response.text) diff --git a/utxo-combiner/UnspentOutputs.py b/utxo-combiner/UnspentOutputs.py index 946a615..632b05f 100644 --- a/utxo-combiner/UnspentOutputs.py +++ b/utxo-combiner/UnspentOutputs.py @@ -1,5 +1,6 @@ import json import os +import time from Account import Account from Asset import Asset @@ -9,6 +10,19 @@ from Transaction import Action, Transaction class UnspentOutputs(object): @staticmethod + def get_block_height(connection): + response = connection.request("/get-block-count") + + resp_json = json.loads(response.text) + + if resp_json['status'] == 'success': + return resp_json['data']['block_count'], 1 + elif resp_json['status'] == 'fail': + return resp_json['msg'], -1 + else: + return resp_json, 0 + + @staticmethod def list_UTXO(connection): response = connection.request("/list-unspent-outputs") @@ -22,13 +36,24 @@ class UnspentOutputs(object): return resp_json, 0 @staticmethod - def list_by_account_asset(connection, account_alias, asset_alias): - utxos, ret = UnspentOutputs.list_UTXO(connection) + def list_mature_UTXO(connection): result = [] - if ret == 1: + utxos, ret = UnspentOutputs.list_UTXO(connection=connection) + block_height, ret_code = UnspentOutputs.get_block_height(connection=connection) + if ret == 1 and ret_code == 1: for utxo in utxos: - if utxo['account_alias'] == account_alias and utxo['asset_alias'] == asset_alias: + # append mature utxo to set + if utxo['valid_height'] < block_height: result.append(utxo) + return result + + @staticmethod + def list_by_account_asset(connection, account_alias, asset_alias): + utxos = UnspentOutputs.list_mature_UTXO(connection) + result = [] + for utxo in utxos: + if utxo['account_alias'] == account_alias and utxo['asset_alias'] == asset_alias: + result.append(utxo) return result @@ -74,14 +99,33 @@ class UnspentOutputs(object): @staticmethod def combine_utxos(connection, account_alias, password, asset_alias='BTM', max_amount=5000000000, size=20): actions = UnspentOutputs.combine_actions(connection, account_alias, asset_alias, max_amount, size) - print(actions) + # print(actions) issuance = Transaction.build_transaction(connection, actions) - print("issuance:", issuance) + # print("issuance:", issuance) # sign transaction signed_raw_transaction = Transaction.sign_transaction(connection, password, issuance) - print("signed_raw_transaction:", signed_raw_transaction) + # print("signed_raw_transaction:", signed_raw_transaction) # submit transaction - tx_id = Transaction.submit_transaction(connection, signed_raw_transaction) + tx_submit = Transaction.submit_transaction(connection, signed_raw_transaction) + tx_id = tx_submit['tx_id'] print("tx_id:", tx_id) if tx_id is not None: print("success to combine utxos.") + + print("wait combine tx to chain...(about 2.5 minutes)") + + while True: + tx, ret = Transaction.get_transaction(connection=connection, tx_id=tx_id) + if ret == 1: + # print(tx) + if int(tx['block_index']) > 0: + print("combine tx to chain. You can combine next utxos.") + break + elif ret == -1: + print("tx:", tx) + break + time.sleep(2) + else: + print(actions) + print("issuance:", issuance) + print("signed_raw_transaction:", signed_raw_transaction) diff --git a/utxo-combiner/transaction_test.py b/utxo-combiner/transaction_test.py index 15d823c..caa7b72 100644 --- a/utxo-combiner/transaction_test.py +++ b/utxo-combiner/transaction_test.py @@ -27,10 +27,11 @@ class TestTransactionMethods(unittest.TestCase): print(tx) def test_get_transaction(self): - con = Connection("http://127.0.0.1:9888") - tx_id = "5120dc0b2fe372e8f551b7e02ce5a44eb2a7b37108303d15ef8b601bfc9c1d5b" - tx = Transaction.get_transaction(con, tx_id) + con = Connection("http://116.62.130.184:9888") + tx_id = "eb535916e05ecee1a193ce489e5151c873f459639fcabffdc2df69f7f76fc550" + tx, ret = Transaction.get_transaction(con, tx_id) print(tx) + print(ret) def test_issue_transaction(self): # build transaction diff --git a/utxo-combiner/unspent_outputs_test.py b/utxo-combiner/unspent_outputs_test.py index ddc0c25..4e085f7 100644 --- a/utxo-combiner/unspent_outputs_test.py +++ b/utxo-combiner/unspent_outputs_test.py @@ -7,6 +7,12 @@ from UnspentOutputs import UnspentOutputs class TestUTXOMethods(unittest.TestCase): + def test_get_block_height(self): + con = Connection("http://127.0.0.1:9888") + block_height, ret = UnspentOutputs.get_block_height(connection=con) + if ret == 1: + print(block_height) + def test_list_UTXO(self): con = Connection("http://127.0.0.1:9888") utxos, ret = UnspentOutputs.list_UTXO(con) @@ -47,7 +53,7 @@ class TestUTXOMethods(unittest.TestCase): con = Connection("http://127.0.0.1:9888") account_alias = "zhangsan" asset_alias = "BTM" - UnspentOutputs.combine_utxos(connection=con, account_alias=account_alias, password='123456', max_amount=5000000000, size=20) + UnspentOutputs.combine_utxos(connection=con, account_alias=account_alias, password='123456', max_amount=50, size=20) if __name__ == '__main__': unittest.main() diff --git a/utxo-combiner/utxo_combiner.py b/utxo-combiner/utxo_combiner.py new file mode 100644 index 0000000..4d3ed0b --- /dev/null +++ b/utxo-combiner/utxo_combiner.py @@ -0,0 +1,55 @@ +import sys, getopt +from UnspentOutputs import UnspentOutputs +from connection import Connection + + +def main(argv): + try: + opts, args = getopt.getopt(argv, "hc:a:p:m:s:", + ["connection=", "account=", "password=", "max_amount=", "size="]) + except getopt.GetoptError: + print('python test.py -c -a -p ', + '[optional] -m -s ') + print( + 'python test.py --connection --account --password ', + '[optional] --max_amount --size ') + sys.exit(2) + + # print("opts", opts) + + connection = Connection.generate() + account_alias = "" + password = "" + max_amount = "" + size = "" + + for op, value in opts: + if op in ("-c", "--connection"): + connection = Connection(value) + # print(connection) + elif op in ("-a", "--account"): + account_alias = value + # print(account_alias) + elif op in ("-p", "--password"): + password = value + # print(password) + elif op in ("-m", "--max_amount"): + max_amount = int(value) + # print(max_amount) + elif op in ("-s", "--size"): + size = int(value) + # print(size) + elif op in ("-h", "--help"): + print('python test.py -c -a -p ', + '[optional] -m -s ') + print( + 'python test.py --connection --account --password ', + '[optional] --max_amount --size ') + sys.exit() + + UnspentOutputs.combine_utxos(connection=connection, account_alias=account_alias, + password=password, max_amount=max_amount, size=size) + + +if __name__ == '__main__': + main(sys.argv[1:]) -- 2.11.0