from app.api.resources import Broadcast_Transaction
from app.api.resources import Create_QRcode_Base64
from app.api.resources import Create_New_Key
+from app.api.resources import Create_New_Address
blueprint = Blueprint('api', __name__, url_prefix='/api/v1')
api = Api(blueprint)
api.add_resource(Get_Path_From_Index, '/get_path_from_index')
api.add_resource(Broadcast_Transaction, '/broadcast_transaction')
api.add_resource(Create_QRcode_Base64, '/create_qrcode_base64')
-api.add_resource(Create_New_Key, '/create_new_key')
\ No newline at end of file
+api.add_resource(Create_New_Key, '/create_new_key')
+api.add_resource(Create_New_Address, '/create_new_address')
\ No newline at end of file
from app.model.receiver import create_qrcode_base64
from app.model.transaction import broadcast_transaction
from app.model.key import create_new_key
+from app.model.receiver import create_new_address
parser = reqparse.RequestParser()
class Create_New_Key(Resource):
def post(self):
- return create_new_key()
\ No newline at end of file
+ return create_new_key()
+
+
+class Create_New_Address(Resource):
+
+ def post(self):
+ args = parser.parse_args()
+ xpub = args.get('xpub_str')
+ account_index = args.get('account_index_int')
+ address_index = args.get('address_index_int')
+ change = args.get('change_bool')
+ network = args.get('network_str')
+ response = create_new_address(xpub, account_index, address_index, change, network)
+ return response
\ No newline at end of file
import hashlib
-from app.model.key import *
+from app.model import key
from app.model import segwit_addr
import qrcode
import pybase64
path_list = ['2c000000', '99000000']
account_index_str = (account_index_int).to_bytes(4, byteorder='little').hex()
path_list.append(account_index_str)
+ change_str = '0'
if change_bool:
branch_str = (1).to_bytes(4, byteorder='little').hex()
+ change_str = '1'
else:
branch_str = (0).to_bytes(4, byteorder='little').hex()
path_list.append(branch_str)
address_index_str = (address_index_int).to_bytes(4, byteorder='little').hex()
path_list.append(address_index_str)
+ path_str = 'm/44/153/' + str(account_index_int) + '/' + change_str + '/' + str(address_index_int)
return {
- "path": path_list
+ "path": path_list,
+ "path_str": path_str
}
# control_program: 001431f2b90b469e89361225aae370f73e5473b9852b
def create_P2WPKH_program(account_index_int, address_index_int, change_bool, xpub_str):
path_list = get_path_from_index(account_index_int, address_index_int, change_bool)['path']
- child_xpub_str = xpub_to_child_xpub(xpub_str, path_list)['child_xpub']
- child_public_key_str = xpub_to_public_key(child_xpub_str)['public_key']
+ child_xpub_str = key.xpub_to_child_xpub(xpub_str, path_list)['child_xpub']
+ child_public_key_str = key.xpub_to_public_key(child_xpub_str)['public_key']
child_public_key_byte = bytes.fromhex(child_public_key_str)
ripemd160 = hashlib.new('ripemd160')
"base64": base64_str
}
+# create_new_address create address and address qrcode
+# test data 1:
+# xpub_str: 8fde12d7c9d6b6cbfbf344edd42f2ed86ae6270b36bab714af5fd5bb3b54adcec4265f1de85ece50f17534e42016ee9404a11fec94ddfadd4a064d27ef3f3f4c
+# account_index_int: 1
+# address_index_int: 1
+# change_bool: False
+# network_str: solonet
+# path: m/44/153/1/0/1
+# control_program: 00147640f3c34fe4b2b298e54e54a4692a47ce47aa5e
+# address: sm1qweq08s60ujet9x89fe22g6f2gl8y02j7lgr5v5
+# address_base64: /9j/4AAQSkZJRgABAQ...
+# test data 2:
+# xpub_str: 8fde12d7c9d6b6cbfbf344edd42f2ed86ae6270b36bab714af5fd5bb3b54adcec4265f1de85ece50f17534e42016ee9404a11fec94ddfadd4a064d27ef3f3f4c
+# account_index_int: 12
+# address_index_int: 3
+# change_bool: True
+# network_str: mainnet
+# path: m/44/153/12/1/3
+# control_program: 001458b1477abc46ef81905d25011d36389c0788984b
+# address: bm1qtzc5w74ugmhcryzay5q36d3cnsrc3xztzw6u4y
+# address_base64: /9j/4AAQSkZJRgABAQA...
+# test data 3:
+# xpub_str: 8fde12d7c9d6b6cbfbf344edd42f2ed86ae6270b36bab714af5fd5bb3b54adcec4265f1de85ece50f17534e42016ee9404a11fec94ddfadd4a064d27ef3f3f4c
+# account_index_int: 200
+# address_index_int: 1
+# change_bool: True
+# network_str: mainnet
+# path: m/44/153/200/1/1
+# control_program: 00144e5c8757c612c21aa2a0c55f1f8e2ab57cfdefca
+# address: bm1qfewgw47xztpp4g4qc403lr32k470mm724cphhp
+# address_base64: /9j/4AAQSkZJRgABAQA...
+def create_new_address(xpub_str, account_index_int, address_index_int, change_bool, network_str):
+ path_str = get_path_from_index(account_index_int, address_index_int, change_bool)['path_str']
+ control_program_str = create_P2WPKH_program(account_index_int, address_index_int, change_bool, xpub_str)['control_program']
+ address_str = create_address(control_program_str, network_str)['address']
+ address_base64 = create_qrcode_base64(address_str)['base64']
+ return {
+ "path": path_str,
+ "control_program": control_program_str,
+ "address": address_str,
+ "address_base64": address_base64
+ }
<div class="form-group">
<label class="col-sm-2 control-label">Entropy</label>
<div class="col-sm-10">
- <input type="text" class="form-control" id="txtEntropy" placeholder="16 Bytes entropy, e.g. 58b39966f63d490314134c0f583018db">
+ <input type="text" class="form-control" id="txtEntropy" placeholder="16 Bytes entropy, e.g. 58b39966f63d490314134c0f583018db" readonly>
</div>
</div>
<!-- 助记词 -->
<div class="form-group">
<label class="col-sm-2 control-label">Mnemonics</label>
<div class="col-sm-10">
- <input type="text" class="form-control" id="txtMnemonics" placeholder="12 mnemonics, e.g. flavor orphan fluid unaware stand light expect hat aunt screen alert response">
+ <input type="text" class="form-control" id="txtMnemonics" placeholder="12 mnemonics, e.g. flavor orphan fluid unaware stand light expect hat aunt screen alert response" readonly>
</div>
</div>
<!-- 种子 -->
<div class="form-group">
<label class="col-sm-2 control-label">Seed</label>
<div class="col-sm-10">
- <input type="text" class="form-control" id="txtSeed" placeholder="64 Bytes seed, e.g. ba87798bdf2def688ecfdae52b039ce1c9b05881d762e64a6a3a9e9472bdf1381e7517fcbb9c92ca666edb4f22a58be4883f133736634da09e7b389a3de6f1d1">
+ <input type="text" class="form-control" id="txtSeed" placeholder="64 Bytes seed, e.g. ba87798bdf2def688ecfdae52b039ce1c9b05881d762e64a6a3a9e9472bdf1381e7517fcbb9c92ca666edb4f22a58be4883f133736634da09e7b389a3de6f1d1" readonly>
</div>
</div>
<!-- 根扩展私钥 -->
<div class="form-group">
<label class="col-sm-2 control-label">Root Expanded Private Key</label>
<div class="col-sm-10">
- <input type="text" class="form-control" id="txtRootXprv" placeholder="64 Bytes root expanded private key, e.g. 20c96e3a582684c4bffc71be0c8aa06b8948a65bdf7cfac4533f9e07c98afc47c976554fbd99c9f63c7fcefb089f65c5db6a1af4429600384b1d9f2751cef942">
+ <input type="text" class="form-control" id="txtRootXprv" placeholder="64 Bytes root expanded private key, e.g. 20c96e3a582684c4bffc71be0c8aa06b8948a65bdf7cfac4533f9e07c98afc47c976554fbd99c9f63c7fcefb089f65c5db6a1af4429600384b1d9f2751cef942" readonly>
</div>
</div>
<!-- 根扩展公钥 -->
<div class="form-group">
<label class="col-sm-2 control-label">Root Expanded Public Key</label>
<div class="col-sm-10">
- <input type="text" class="form-control" id="txtRootXpub" placeholder="64 Bytes root expanded public key, e.g. 8680afdf7c21f5315d6a40183653c8def35679f8bae870687bc786df54317863c976554fbd99c9f63c7fcefb089f65c5db6a1af4429600384b1d9f2751cef942">
+ <input type="text" class="form-control" id="txtRootXpub" placeholder="64 Bytes root expanded public key, e.g. 8680afdf7c21f5315d6a40183653c8def35679f8bae870687bc786df54317863c976554fbd99c9f63c7fcefb089f65c5db6a1af4429600384b1d9f2751cef942" readonly>
</div>
</div>
<!-- 根扩展私钥二维码 -->
</label>
</div>
</div>
- <!-- 地址路径 -->
- <div class="form-group">
- <label class="col-sm-2 control-label">Address Path</label>
- <div class="col-sm-10">
- <input type="text" class="form-control" id="txtAddressPath" placeholder="Address Path, e.g. ">
- </div>
- </div>
- <!-- control program -->
- <div class="form-group">
- <label class="col-sm-2 control-label">Control Program</label>
- <div class="col-sm-10">
- <input type="text" class="form-control" id="txtControlProgram" placeholder="Control Program, e.g. 001431f2b90b469e89361225aae370f73e5473b9852b">
- </div>
- </div>
<!-- 网络 -->
<div class="form-group">
<label class="col-sm-2 control-label">Network</label>
</label>
</div>
</div>
+ <!-- 地址路径 -->
+ <div class="form-group">
+ <label class="col-sm-2 control-label">Address Path</label>
+ <div class="col-sm-10">
+ <input type="text" class="form-control" id="txtAddressPath" placeholder="Address Path, e.g. " readonly>
+ </div>
+ </div>
+ <!-- control program -->
+ <div class="form-group">
+ <label class="col-sm-2 control-label">Control Program</label>
+ <div class="col-sm-10">
+ <input type="text" class="form-control" id="txtControlProgram" placeholder="Control Program, e.g. 001431f2b90b469e89361225aae370f73e5473b9852b" readonly>
+ </div>
+ </div>
<!-- 地址 -->
<div class="form-group">
<label class="col-sm-2 control-label">Address</label>
<div class="col-sm-10">
- <input type="text" class="form-control" id="txtAddress" placeholder="Address, e.g. bm1qx8etjz6xn6ynvy394t3hpae723emnpft3nrwej">
+ <input type="text" class="form-control" id="txtAddress" placeholder="Address, e.g. bm1qx8etjz6xn6ynvy394t3hpae723emnpft3nrwej" readonly>
</div>
</div>
<!-- 根扩展私钥二维码 -->