OSDN Git Service

add create_new_address
authorChengcheng Zhang <943420582@qq.com>
Wed, 16 Jan 2019 08:26:46 +0000 (16:26 +0800)
committerChengcheng Zhang <943420582@qq.com>
Wed, 16 Jan 2019 08:26:46 +0000 (16:26 +0800)
app/api/__init__.py
app/api/resources.py
app/model/receiver.py
key.html

index b1e7e66..90620dd 100644 (file)
@@ -21,6 +21,7 @@ from app.api.resources import Get_Path_From_Index
 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)
@@ -44,4 +45,5 @@ api.add_resource(Create_Address, '/create_address')
 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
index 0ba347d..082d6a6 100644 (file)
@@ -22,6 +22,7 @@ from app.model.receiver import get_path_from_index
 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()
@@ -210,4 +211,17 @@ class Create_QRcode_Base64(Resource):
 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
index 023dc88..9c63ae4 100644 (file)
@@ -1,5 +1,5 @@
 import hashlib
-from app.model.key import *
+from app.model import key
 from app.model import segwit_addr
 import qrcode
 import pybase64
@@ -32,15 +32,19 @@ def get_path_from_index(account_index_int, address_index_int, change_bool):
     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
     }
 
 
@@ -76,8 +80,8 @@ def get_path_from_index(account_index_int, address_index_int, change_bool):
 #   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')
@@ -141,3 +145,45 @@ def create_qrcode_base64(s):
         "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
+    }
index 539ce17..038f6e4 100644 (file)
--- a/key.html
+++ b/key.html
         <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>
         <!-- 根扩展私钥二维码 -->