OSDN Git Service

70a29f2bfafa2f6a22f6390d5a08df4b5ccb5a21
[bytom/bytom-spanner.git] / btmtransaction.py
1 import os
2 import sys
3 import httprequest
4
5 miner_fee = 40000000
6 max_output = 100
7
8
9 def handle_input(_path, _account_id, _password):
10     lines = list()
11     with open(_path, 'r', encoding='utf-8') as file:
12         for line in file:
13             line = line.strip()
14             if len(lines) < max_output:
15                 lines.append(line)
16             else:
17                 handle_transaction(lines, _path, _account_id, _password)
18                 lines.clear()
19                 lines.append(line)
20     if len(lines) > 0:
21         handle_transaction(lines, _path, _account_id, _password)
22     print('Transaction is accomplished.Please check accomplished.txt')
23
24
25 def handle_transaction(lines, _path, _account_id, _password):
26     data = build_transaction(lines, _account_id)
27     data = sign_transaction(_password, data)
28     if data['sign_complete']:
29         data = submit_transaction(data)
30         txid = data['tx_id']
31         if txid:
32             print('transaction_id:\n' + txid)
33             lines = append_txid_to_lines(lines, txid)
34             write_lines_to_file(lines, _path)
35     else:
36         print('Sign transaction is failed.Please check account password.')
37         sys.exit(1)
38
39
40 # parameter lines: max_output line list
41 def build_transaction(_lines, _account_id):
42     amount_sum = 0
43     action_list = list()
44     for line in _lines:
45         data = line.strip().split(',')
46         address = data[0]
47         amount = int(data[1])
48         amount_sum += amount
49         address_dict = get_address_dict(amount, address)
50         action_list.append(address_dict)
51     amount_sum += miner_fee
52     spend_dict = get_spend_dict(_account_id, int(amount_sum))
53     action_list.insert(0, spend_dict)
54     parameter = {'base_transaction': None, 'actions': action_list, 'ttl': 0}
55     return httprequest.post('build-transaction', parameter)
56
57
58 # parameter transaction: dict from build_transaction function return
59 def sign_transaction(_password, _transaction):
60     parameter = {'password': _password, 'transaction': _transaction}
61     return httprequest.post('sign-transaction', parameter)
62
63
64 def submit_transaction(_transaction):
65     parameter = {'raw_transaction': _transaction['transaction']['raw_transaction']}
66     return httprequest.post('submit-transaction', parameter)
67
68
69 def append_txid_to_lines(lines, txid):
70     for i in range(len(lines)):
71         # lines[i] = lines[i] + ',' + txid + '\n'
72         lines[i] = lines[i] + ',' + '\n'
73     return lines
74
75
76 # write complete transactions lines to file
77 def write_lines_to_file(lines, _path):
78     _path = os.path.abspath(os.path.dirname(_path)) + os.path.sep + 'accomplished.txt'
79     with open(_path, 'a', encoding='utf-8') as file:
80         file.writelines(lines)
81
82
83 # control_address action
84 def get_address_dict(_amount, _address):
85     return {'amount': _amount,
86             'asset_id': 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
87             'address': _address,
88             'type': 'control_address'}
89
90
91 # spend_account action
92 def get_spend_dict(_account_id, _amount_sum):
93     return {'account_id': _account_id,
94             'amount': _amount_sum,
95             'asset_id': 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
96             'type': 'spend_account'}
97
98 # if __name__ == "__main__":
99 #     path = '/Users/john/Desktop/btm.txt'
100 #     account_id = '0F0BV1OLG0A04'
101 #     password = '123456'
102 #     sys.exit(handle_input(path, account_id, password))