copay錢包(3.轉(zhuǎn)賬功能報(bào)文分析)

set_wallet.png

建立tx報(bào)文

Request

Request URL: https://bws.bitpay.com/bws/api/v2/txproposals/
Request Method: POST
Status Code: 200

Request Header

x-identity: ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f
x-signature: 30440220112e0e2f0c47ad929ba96a2cf66e146508be54849b34f2ff9aa0e8e941d5febd02202cee1c2388076a9be937b788bbbccf1e59bc620421396142fbbfc19b74d04a06

Request Body

{
    "outputs": [{
        "toAddress": "2MtpsphTrgwZ6CmJrtZPmyUBJrKH9A8yijk",
        "amount": 200000,
        "message": null
    }],
    "feeLevel": "normal",
    "message": null,
    "excludeUnconfirmedUtxos": true,
    "dryRun": true,
    "payProUrl": null
}

Response Body

{
    "version": 3,
    "createdOn": 1525848972,
    "id": "0cb7f9ef-b416-4ff2-b717-7fc5e218ffd2",
    "walletId": "a887f15f-d0d5-42b5-a794-73bf92859b0e",
    "creatorId": "ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f",
    "coin": "btc",
    "network": "testnet",
    "message": null,
    "payProUrl": null,
    "changeAddress": {
        "version": "1.0.0",
        "createdOn": 1525848972,
        "address": "2N9iPM2BCiZY9QhVXBvkwvVEPFA799pWPHk",
        "walletId": "a887f15f-d0d5-42b5-a794-73bf92859b0e",
        "isChange": true,
        "path": "m/1/3",
        "publicKeys": ["036b550d9c5a5b385d55a1ed2f57a3523808877fe096aeff0f24d2d847267e0052", "03fa031596a39e82c8b2d40fceb6464b68e3156566c1e1c4f579eaf67b97bb2933"],
        "coin": "btc",
        "network": "testnet",
        "type": "P2SH"
    },
    "outputs": [{
        "amount": 200000,
        "toAddress": "2MtpsphTrgwZ6CmJrtZPmyUBJrKH9A8yijk",
        "message": null
    }],
    "outputOrder": [0, 1],
    "walletM": 1,
    "walletN": 2,
    "requiredSignatures": 1,
    "requiredRejections": 1,
    "status": "temporary",
    "actions": [],
    "feeLevel": "normal",
    "feePerKb": 1000,
    "excludeUnconfirmedUtxos": true,
    "addressType": "P2SH",
    "amount": 200000,
    "inputs": [{
        "txid": "e0f2ca534e9da941ac832eedbf5ec229408a43153aafb1356246e405463b7bfb",
        "vout": 0,
        "address": "2MtDw9oCLZ8mPp63CzwMH37ubKB7K2LtoQq",
        "scriptPubKey": "a9140ab9a7e6311a5ba83d11fff29d97290528d8665987",
        "satoshis": 985800,
        "confirmations": 7176,
        "locked": false,
        "path": "m/1/1",
        "publicKeys": ["03480e89ec9a061f60a7bcb6fd2fe423ccdde9b58662273cc0b8f41f1b0c6122ae", "02727fb32888be1dbc59a0786280fe5e6f77119258891cf5280fa89bf3c14be933"]
    }],
    "inputPaths": ["m/1/1"],
    "fee": 284
}

建立tx的交易,在pages/send/confirm頁(yè)面選擇發(fā)送錢包時(shí)候觸發(fā),調(diào)用的代碼大致如下:

this.updateTx(this.tx, this.wallet, { dryRun: true }).catch((err: any) => {
      this.logger.warn('Error in updateTx: ', err);
    });

在updateTx()內(nèi)部又調(diào)用了:

this.buildTxp(tx, wallet, opts).then(() => {
            this.onGoingProcessProvider.clear();
            return resolve();
          }).catch((err: any) => {
            this.onGoingProcessProvider.clear();
            return reject(err);
          });

最終,是由walletProvider向后臺(tái)服務(wù)請(qǐng)求生成交易

this.walletProvider.createTx(wallet, txp).then((ctxp: any) => {
        return resolve(ctxp);
      }).catch((err: any) => {
        this.setSendError(err);
        return reject(err);
      });

這里最終調(diào)用了wallet-client的createTxProposal(),從請(qǐng)求報(bào)文可以看出,client端并沒(méi)有自己去生成這轉(zhuǎn)出交易,而是向server端傳送了必要的output信息(接收地址,金額,備注),而是由server端根據(jù)這些配置,"代替"client端完成創(chuàng)建交易的工作.
P.S.client端并沒(méi)有向server傳送用那個(gè)哪戶轉(zhuǎn)出,server端是怎么感知的呢?秘密在于Request Header的x-signature,該值是在構(gòu)造wallet時(shí)候,由wallet公鑰生成的,而server器端存儲(chǔ)有wallet的信息,所以只需要傳遞該值,server端就能自動(dòng)判斷是哪個(gè)賬戶轉(zhuǎn)出的侧甫。

send.png

建立tx報(bào)文(第二次)

Request

Request URL: https://bws.bitpay.com/bws/api/v2/txproposals/
Request Method: POST
Status Code: 200

Request Header

x-client-version: bwc-6.7.4
x-identity: ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f
x-signature: 30440220429565307510d449e5aa39fded3c7b7322642d6f932f72273f8e680abc227f0d02201fb1bf4785815768a8d2ac98cdcfc98228d94aa84ff0733f9228cfb9682d976d

Request Body

{
    "outputs": [{
        "toAddress": "2MtpsphTrgwZ6CmJrtZPmyUBJrKH9A8yijk",
        "amount": 200000,
        "message": null
    }],
    "feeLevel": "normal",
    "message": null,
    "excludeUnconfirmedUtxos": true,
    "dryRun": false,
    "payProUrl": null
}

Response Body

{
    "version": 3,
    "createdOn": 1525848985,
    "id": "1cdb4398-03da-4180-ab5e-97499a3623d4",
    "walletId": "a887f15f-d0d5-42b5-a794-73bf92859b0e",
    "creatorId": "ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f",
    "coin": "btc",
    "network": "testnet",
    "message": null,
    "payProUrl": null,
    "changeAddress": {
        "version": "1.0.0",
        "createdOn": 1525848985,
        "address": "2N9iPM2BCiZY9QhVXBvkwvVEPFA799pWPHk",
        "walletId": "a887f15f-d0d5-42b5-a794-73bf92859b0e",
        "isChange": true,
        "path": "m/1/3",
        "publicKeys": ["036b550d9c5a5b385d55a1ed2f57a3523808877fe096aeff0f24d2d847267e0052", "03fa031596a39e82c8b2d40fceb6464b68e3156566c1e1c4f579eaf67b97bb2933"],
        "coin": "btc",
        "network": "testnet",
        "type": "P2SH",
        "_id": "5af29b99bda304640dbd4ee0"
    },
    "outputs": [{
        "amount": 200000,
        "toAddress": "2MtpsphTrgwZ6CmJrtZPmyUBJrKH9A8yijk",
        "message": null
    }],
    "outputOrder": [1, 0],
    "walletM": 1,
    "walletN": 2,
    "requiredSignatures": 1,
    "requiredRejections": 1,
    "status": "temporary",
    "actions": [],
    "feeLevel": "normal",
    "feePerKb": 1000,
    "excludeUnconfirmedUtxos": true,
    "addressType": "P2SH",
    "amount": 200000,
    "inputs": [{
        "txid": "e0f2ca534e9da941ac832eedbf5ec229408a43153aafb1356246e405463b7bfb",
        "vout": 0,
        "address": "2MtDw9oCLZ8mPp63CzwMH37ubKB7K2LtoQq",
        "scriptPubKey": "a9140ab9a7e6311a5ba83d11fff29d97290528d8665987",
        "satoshis": 985800,
        "confirmations": 7176,
        "locked": false,
        "path": "m/1/1",
        "publicKeys": ["03480e89ec9a061f60a7bcb6fd2fe423ccdde9b58662273cc0b8f41f1b0c6122ae", "02727fb32888be1dbc59a0786280fe5e6f77119258891cf5280fa89bf3c14be933"]
    }],
    "inputPaths": ["m/1/1"],
    "fee": 284
}

在點(diǎn)擊發(fā)送按鈕后炒辉,

 public approve(tx: any, wallet: any): void {...
 }

在approve方法中,client會(huì)再次向server端申請(qǐng)create一次交易顽素,當(dāng)然,server還是會(huì)去生成一個(gè)
未用的hd地址作為change(由于第一次的沒(méi)有真實(shí)用,地址還是和第一次一樣的).但是由于創(chuàng)建的時(shí)間已經(jīng)不同了,所以生成的tx-id是完全不同的.

confrim_send.png

推送tx報(bào)文

Request

Request URL: https://bws.bitpay.com/bws/api/v1/txproposals/1cdb4398-03da-4180-ab5e-97499a3623d4/publish/
Request Method: POST
Status Code: 200

Request Header

x-identity: ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f
x-signature: 30440220642fc81dfac718c3c382e204574ca5bc6c45742d07cd94465d5435cae2bc02d40220546d0b19bb2663f9fdfbd6ac4a836aeecb85246d82c971cc36603ccc9bcdd244

Request Body

{
    "proposalSignature": "3045022100c88e1997e6f7e3b2c7a57f90c561b91888475fc9d83c9b562a4c10f8d2b2589f02206d0961ddef78654ad012b49ffbb97d370b578c51c4fbe9adeadbe2257cfeb256"
}

Response Body

{
    "version": 3,
    "createdOn": 1525848985,
    "id": "1cdb4398-03da-4180-ab5e-97499a3623d4",
    "walletId": "a887f15f-d0d5-42b5-a794-73bf92859b0e",
    "creatorId": "ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f",
    "coin": "btc",
    "network": "testnet",
    "outputs": [{
        "amount": 200000,
        "toAddress": "2MtpsphTrgwZ6CmJrtZPmyUBJrKH9A8yijk",
        "message": null
    }],
    "amount": 200000,
    "message": null,
    "payProUrl": null,
    "changeAddress": {
        "version": "1.0.0",
        "createdOn": 1525848985,
        "address": "2N9iPM2BCiZY9QhVXBvkwvVEPFA799pWPHk",
        "walletId": "a887f15f-d0d5-42b5-a794-73bf92859b0e",
        "isChange": true,
        "path": "m/1/3",
        "publicKeys": ["036b550d9c5a5b385d55a1ed2f57a3523808877fe096aeff0f24d2d847267e0052", "03fa031596a39e82c8b2d40fceb6464b68e3156566c1e1c4f579eaf67b97bb2933"],
        "coin": "btc",
        "network": "testnet",
        "type": "P2SH",
        "hasActivity": null,
        "_id": "5af29b99bda304640dbd4ee0"
    },
    "inputs": [{
        "txid": "e0f2ca534e9da941ac832eedbf5ec229408a43153aafb1356246e405463b7bfb",
        "vout": 0,
        "address": "2MtDw9oCLZ8mPp63CzwMH37ubKB7K2LtoQq",
        "scriptPubKey": "a9140ab9a7e6311a5ba83d11fff29d97290528d8665987",
        "satoshis": 985800,
        "confirmations": 7176,
        "locked": false,
        "path": "m/1/1",
        "publicKeys": ["03480e89ec9a061f60a7bcb6fd2fe423ccdde9b58662273cc0b8f41f1b0c6122ae", "02727fb32888be1dbc59a0786280fe5e6f77119258891cf5280fa89bf3c14be933"]
    }],
    "walletM": 1,
    "walletN": 2,
    "requiredSignatures": 1,
    "requiredRejections": 1,
    "status": "pending",
    "inputPaths": ["m/1/1"],
    "actions": [],
    "outputOrder": [1, 0],
    "fee": 284,
    "feeLevel": "normal",
    "feePerKb": 1000,
    "excludeUnconfirmedUtxos": true,
    "addressType": "P2SH",
    "customData": null,
    "proposalSignature": "3045022100c88e1997e6f7e3b2c7a57f90c561b91888475fc9d83c9b562a4c10f8d2b2589f02206d0961ddef78654ad012b49ffbb97d370b578c51c4fbe9adeadbe2257cfeb256",
    "derivationStrategy": "BIP44",
    "creatorName": "{\"iv\":\"0Tx0HkyTJdQpsgXx2QAFoQ==\",\"v\":1,\"iter\":1,\"ks\":128,\"ts\":64,\"mode\":\"ccm\",\"adata\":\"\",\"cipher\":\"aes\",\"ct\":\"zdicqfgF5a0ccpAc/jMjR/UB\"}"
}

在點(diǎn)擊發(fā)送確認(rèn)按鈕后,client端就開始真正的處理這個(gè)交易了,具體的調(diào)用過(guò)程為
approve()方法在調(diào)用this.popupProvider.ionicConfirm()彈出確認(rèn)框后,構(gòu)造并調(diào)用了自己"剛剛"聲明的publishAndSign()方法,其內(nèi)部則調(diào)用了walletProvider的publishAndSign()方法實(shí)現(xiàn).

      let publishAndSign = (): void => {
        if (!wallet.canSign() && !wallet.isPrivKeyExternal()) {
          this.logger.info('No signing proposal: No private key');
          this.onGoingProcessProvider.set('sendingTx');
          this.walletProvider.onlyPublish(wallet, txp).then(() => {
            this.onGoingProcessProvider.clear();
            this.openFinishModal(true);
          }).catch((err: any) => {
            this.onGoingProcessProvider.clear();
            this.setSendError(err);
          });
          return;
        }

        this.walletProvider.publishAndSign(wallet, txp).then((txp: any) => {
          this.onGoingProcessProvider.clear();
          if (this.config.confirmedTxsNotifications && this.config.confirmedTxsNotifications.enabled) {
            this.txConfirmNotificationProvider.subscribe(wallet, {
              txid: txp.txid
            });
          }
          this.openFinishModal();
        }).catch((err: any) => {
          this.onGoingProcessProvider.clear();
          this.setSendError(err);
          return;
        });
      };
      
this.walletProvider.publishAndSign(wallet, txp)

publishAndSign()可是一氣呵成完成了三個(gè)步驟,

// 發(fā)布:
wallet.publishTxProposal(({txp},...)
// 簽名:
wallet.signTxProposal(txp, password, (err: any, signedTxp: any)
// 廣播:
wallet.broadcastTxProposal(txp, (err: any, broadcastedTxp: any, memo: any)

由于tx本身就是server端構(gòu)造的,所以client僅需要在url中指出所對(duì)應(yīng)的tx-id,并補(bǔ)充改步驟需要的信息即可.

簽名tx報(bào)文

Request

Request URL: https://bws.bitpay.com/bws/api/v1/txproposals/1cdb4398-03da-4180-ab5e-97499a3623d4/signatures/
Request Method: POST
Status Code: 200

Request Header

x-identity: ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f
x-signature: 304402203cba7614d6aa2d8fc56ae64c626073e67f53d6ec0cd40a7747517a503af2435a02203117e45c6f7c2c65ccdc7e7f7d86557ab6e6ab866e18493cad73814085b9c955

Request Body

{
    "signatures": ["3044022047ea35be8583908a9994a7144642b628edaad70ad4c4fcb1a36056db55a40b9a022046a5bc8fb29de4c78cd4fc80ae59b27b3a240bbc10fc39e3fd422183d4f5e2e7"]
}

Response Body

{
    "version": 3,
    "createdOn": 1525848985,
    "id": "1cdb4398-03da-4180-ab5e-97499a3623d4",
    "walletId": "a887f15f-d0d5-42b5-a794-73bf92859b0e",
    "creatorId": "ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f",
    "coin": "btc",
    "network": "testnet",
    "outputs": [{
        "amount": 200000,
        "toAddress": "2MtpsphTrgwZ6CmJrtZPmyUBJrKH9A8yijk",
        "message": null
    }],
    "amount": 200000,
    "message": null,
    "payProUrl": null,
    "changeAddress": {
        "version": "1.0.0",
        "createdOn": 1525848985,
        "address": "2N9iPM2BCiZY9QhVXBvkwvVEPFA799pWPHk",
        "walletId": "a887f15f-d0d5-42b5-a794-73bf92859b0e",
        "isChange": true,
        "path": "m/1/3",
        "publicKeys": ["036b550d9c5a5b385d55a1ed2f57a3523808877fe096aeff0f24d2d847267e0052", "03fa031596a39e82c8b2d40fceb6464b68e3156566c1e1c4f579eaf67b97bb2933"],
        "coin": "btc",
        "network": "testnet",
        "type": "P2SH",
        "hasActivity": null,
        "_id": "5af29b99bda304640dbd4ee0"
    },
    "inputs": [{
        "txid": "e0f2ca534e9da941ac832eedbf5ec229408a43153aafb1356246e405463b7bfb",
        "vout": 0,
        "address": "2MtDw9oCLZ8mPp63CzwMH37ubKB7K2LtoQq",
        "scriptPubKey": "a9140ab9a7e6311a5ba83d11fff29d97290528d8665987",
        "satoshis": 985800,
        "confirmations": 7176,
        "locked": false,
        "path": "m/1/1",
        "publicKeys": ["03480e89ec9a061f60a7bcb6fd2fe423ccdde9b58662273cc0b8f41f1b0c6122ae", "02727fb32888be1dbc59a0786280fe5e6f77119258891cf5280fa89bf3c14be933"]
    }],
    "walletM": 1,
    "walletN": 2,
    "requiredSignatures": 1,
    "requiredRejections": 1,
    "status": "accepted",
    "txid": "9bd83411a7849f1546897472ac55e30df24c3700f7cc50b8e44a50b5885299ac",
    "broadcastedOn": null,
    "inputPaths": ["m/1/1"],
    "actions": [{
        "version": "1.0.0",
        "createdOn": 1525849013,
        "copayerId": "ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f",
        "type": "accept",
        "signatures": ["3044022047ea35be8583908a9994a7144642b628edaad70ad4c4fcb1a36056db55a40b9a022046a5bc8fb29de4c78cd4fc80ae59b27b3a240bbc10fc39e3fd422183d4f5e2e7"],
        "xpub": "tpubDDTZjjnaAsDHaD2CNQfsEKSmerbKjp9U5xXUj1UQCWnGLchBFMPM12bWf3izdTnocMA8cJXxwuYa9r8RyrK9GAhemaBEfGwDUiUEEA16rF5",
        "comment": null
    }],
    "outputOrder": [1, 0],
    "fee": 284,
    "feeLevel": "normal",
    "feePerKb": 1000,
    "excludeUnconfirmedUtxos": true,
    "addressType": "P2SH",
    "customData": null,
    "proposalSignature": "3045022100c88e1997e6f7e3b2c7a57f90c561b91888475fc9d83c9b562a4c10f8d2b2589f02206d0961ddef78654ad012b49ffbb97d370b578c51c4fbe9adeadbe2257cfeb256",
    "proposalSignaturePubKey": null,
    "proposalSignaturePubKeySig": null,
    "derivationStrategy": "BIP44",
    "creatorName": "{\"iv\":\"0Tx0HkyTJdQpsgXx2QAFoQ==\",\"v\":1,\"iter\":1,\"ks\":128,\"ts\":64,\"mode\":\"ccm\",\"adata\":\"\",\"cipher\":\"aes\",\"ct\":\"zdicqfgF5a0ccpAc/jMjR/UB\"}",
    "raw": "0100000001fb7b3b4605e4466235b1af3a15438a4029c25ebfed2e83ac41a99d4e53caf2e0000000009100473044022047ea35be8583908a9994a7144642b628edaad70ad4c4fcb1a36056db55a40b9a022046a5bc8fb29de4c78cd4fc80ae59b27b3a240bbc10fc39e3fd422183d4f5e2e70147512102727fb32888be1dbc59a0786280fe5e6f77119258891cf5280fa89bf3c14be9332103480e89ec9a061f60a7bcb6fd2fe423ccdde9b58662273cc0b8f41f1b0c6122ae52aeffffffff026cfc0b000000000017a914b4a50e0687fab537906032b585c1dbc90db425ac87400d03000000000017a91411556f743acba56e8a7ef30d78dcba5c05832ff18700000000"
}

廣播tx報(bào)文

Request

Request URL: https://bws.bitpay.com/bws/api/v1/txproposals/1cdb4398-03da-4180-ab5e-97499a3623d4/broadcast/
Request Method: POST
Status Code: 200

Request Header

x-identity: ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f
x-signature: 3044022035e6368be6e4fd075d1a13a2d77dec90735fa76d7a07e7580456f4c01632fb060220062f57175d286c2927363aae5bfd1af6fce812c4f039e4f63655425241341225

Request Body

{}

Response Body

{
    "version": 3,
    "createdOn": 1525848985,
    "id": "1cdb4398-03da-4180-ab5e-97499a3623d4",
    "walletId": "a887f15f-d0d5-42b5-a794-73bf92859b0e",
    "creatorId": "ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f",
    "coin": "btc",
    "network": "testnet",
    "outputs": [{
        "amount": 200000,
        "toAddress": "2MtpsphTrgwZ6CmJrtZPmyUBJrKH9A8yijk",
        "message": null
    }],
    "amount": 200000,
    "message": null,
    "payProUrl": null,
    "changeAddress": {
        "version": "1.0.0",
        "createdOn": 1525848985,
        "address": "2N9iPM2BCiZY9QhVXBvkwvVEPFA799pWPHk",
        "walletId": "a887f15f-d0d5-42b5-a794-73bf92859b0e",
        "isChange": true,
        "path": "m/1/3",
        "publicKeys": ["036b550d9c5a5b385d55a1ed2f57a3523808877fe096aeff0f24d2d847267e0052", "03fa031596a39e82c8b2d40fceb6464b68e3156566c1e1c4f579eaf67b97bb2933"],
        "coin": "btc",
        "network": "testnet",
        "type": "P2SH",
        "hasActivity": null,
        "_id": "5af29b99bda304640dbd4ee0"
    },
    "inputs": [{
        "txid": "e0f2ca534e9da941ac832eedbf5ec229408a43153aafb1356246e405463b7bfb",
        "vout": 0,
        "address": "2MtDw9oCLZ8mPp63CzwMH37ubKB7K2LtoQq",
        "scriptPubKey": "a9140ab9a7e6311a5ba83d11fff29d97290528d8665987",
        "satoshis": 985800,
        "confirmations": 7176,
        "locked": false,
        "path": "m/1/1",
        "publicKeys": ["03480e89ec9a061f60a7bcb6fd2fe423ccdde9b58662273cc0b8f41f1b0c6122ae", "02727fb32888be1dbc59a0786280fe5e6f77119258891cf5280fa89bf3c14be933"]
    }],
    "walletM": 1,
    "walletN": 2,
    "requiredSignatures": 1,
    "requiredRejections": 1,
    "status": "broadcasted",
    "txid": "9bd83411a7849f1546897472ac55e30df24c3700f7cc50b8e44a50b5885299ac",
    "broadcastedOn": 1525849014,
    "inputPaths": ["m/1/1"],
    "actions": [{
        "version": "1.0.0",
        "createdOn": 1525849013,
        "copayerId": "ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f",
        "type": "accept",
        "signatures": ["3044022047ea35be8583908a9994a7144642b628edaad70ad4c4fcb1a36056db55a40b9a022046a5bc8fb29de4c78cd4fc80ae59b27b3a240bbc10fc39e3fd422183d4f5e2e7"],
        "xpub": "tpubDDTZjjnaAsDHaD2CNQfsEKSmerbKjp9U5xXUj1UQCWnGLchBFMPM12bWf3izdTnocMA8cJXxwuYa9r8RyrK9GAhemaBEfGwDUiUEEA16rF5",
        "comment": null,
        "copayerName": "{\"iv\":\"0Tx0HkyTJdQpsgXx2QAFoQ==\",\"v\":1,\"iter\":1,\"ks\":128,\"ts\":64,\"mode\":\"ccm\",\"adata\":\"\",\"cipher\":\"aes\",\"ct\":\"zdicqfgF5a0ccpAc/jMjR/UB\"}"
    }],
    "outputOrder": [1, 0],
    "fee": 284,
    "feeLevel": "normal",
    "feePerKb": 1000,
    "excludeUnconfirmedUtxos": true,
    "addressType": "P2SH",
    "customData": null,
    "proposalSignature": "3045022100c88e1997e6f7e3b2c7a57f90c561b91888475fc9d83c9b562a4c10f8d2b2589f02206d0961ddef78654ad012b49ffbb97d370b578c51c4fbe9adeadbe2257cfeb256",
    "proposalSignaturePubKey": null,
    "proposalSignaturePubKeySig": null,
    "derivationStrategy": "BIP44",
    "creatorName": "{\"iv\":\"0Tx0HkyTJdQpsgXx2QAFoQ==\",\"v\":1,\"iter\":1,\"ks\":128,\"ts\":64,\"mode\":\"ccm\",\"adata\":\"\",\"cipher\":\"aes\",\"ct\":\"zdicqfgF5a0ccpAc/jMjR/UB\"}",
    "raw": "0100000001fb7b3b4605e4466235b1af3a15438a4029c25ebfed2e83ac41a99d4e53caf2e0000000009100473044022047ea35be8583908a9994a7144642b628edaad70ad4c4fcb1a36056db55a40b9a022046a5bc8fb29de4c78cd4fc80ae59b27b3a240bbc10fc39e3fd422183d4f5e2e70147512102727fb32888be1dbc59a0786280fe5e6f77119258891cf5280fa89bf3c14be9332103480e89ec9a061f60a7bcb6fd2fe423ccdde9b58662273cc0b8f41f1b0c6122ae52aeffffffff026cfc0b000000000017a914b4a50e0687fab537906032b585c1dbc90db425ac87400d03000000000017a91411556f743acba56e8a7ef30d78dcba5c05832ff18700000000"
}

查詢tx

Request

Request URL: https://bws.bitpay.com/bws/api/v1/txconfirmations/
Request Method: POST
Status Code: 200

Request Header

x-identity: ff9c7ce1288026a4184018066bb74ccdb6b7c037d3de887b1378a81cbac1617f
x-signature: 304402203a6a23cd5dcbbe932bea06228bd0695c9939d65e7df65a9b68c603d492e7cd0502201be819417c6385062b06a337eaadddd671c90c478ed07f75ddcd82d29e85d292

Request Body

{
    "txid": "9bd83411a7849f1546897472ac55e30df24c3700f7cc50b8e44a50b5885299ac"
}

Response Body

{
    "ok": 1,
    "nModified": 0,
    "n": 1,
    "upserted": [{
        "index": 0,
        "_id": "5af29bb73834807db7f1b6e5"
    }],
    "lastOp": "6553471618058813445",
    "electionId": "5ac12a1d3834807db7d38cc1"
}

查詢請(qǐng)求是在完成publishAndSign之后,通過(guò)

this.txConfirmNotificationProvider.subscribe(wallet, {
              txid: txp.txid
            });

完成調(diào)用請(qǐng)求的.
這里調(diào)用了client的

client.txConfirmationSubscribe(opts, (err: any, res: any)

從而完成交易確認(rèn)的訂閱.

總結(jié)一下

總的來(lái)說(shuō),copay的交易建立,簽名和廣播都十分的依賴于server端,這大概與其自身實(shí)現(xiàn)的利用server完成多簽交易生成,感知,簽名流程有關(guān),只有把一個(gè)多簽交易拆分能幾個(gè)不完整的子交易,并在網(wǎng)絡(luò)上得以傳播才能實(shí)現(xiàn).
目前,由于client也完整的引用了bitcore-lib,考慮在獲取足夠多的utxo前提下,在client端完成交易的生成,然后推送給client完成廣播.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衅澈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子穴墅,更是在濱河造成了極大的恐慌爽室,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件已维,死亡現(xiàn)場(chǎng)離奇詭異行嗤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)垛耳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門栅屏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人堂鲜,你說(shuō)我怎么就攤上這事栈雳。” “怎么了缔莲?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵哥纫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我痴奏,道長(zhǎng)蛀骇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任读拆,我火速辦了婚禮擅憔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘建椰。我一直安慰自己雕欺,他們只是感情好岛马,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布棉姐。 她就那樣靜靜地躺著屠列,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伞矩。 梳的紋絲不亂的頭發(fā)上笛洛,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音乃坤,去河邊找鬼苛让。 笑死,一個(gè)胖子當(dāng)著我的面吹牛湿诊,可吹牛的內(nèi)容都是我干的狱杰。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼厅须,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼仿畸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起朗和,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤错沽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后眶拉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體千埃,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年忆植,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了放可。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朝刊,死狀恐怖吴侦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坞古,我是刑警寧澤备韧,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站痪枫,受9級(jí)特大地震影響织堂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奶陈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一易阳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吃粒,春花似錦潦俺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)早像。三九已至,卻和暖如春肖爵,著一層夾襖步出監(jiān)牢的瞬間卢鹦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工劝堪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冀自,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓秒啦,卻偏偏與公主長(zhǎng)得像熬粗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子余境,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理荐糜,服務(wù)發(fā)現(xiàn),斷路器葛超,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架暴氏,建立于...
    Hsinwong閱讀 22,363評(píng)論 1 92
  • 1.OkHttp源碼解析(一):OKHttp初階2 OkHttp源碼解析(二):OkHttp連接的"前戲"——HT...
    隔壁老李頭閱讀 20,826評(píng)論 24 176
  • 聽歌聽到王菲的《半途而廢》“半途而廢你無(wú)所謂”答渔。。侥涵。沼撕。怎么會(huì)無(wú)所謂? 都快疼死了芜飘!半途而廢簡(jiǎn)直是人類的疑難雜癥务豺。來(lái)...
    鄒佳_生涯咨詢師閱讀 821評(píng)論 0 6
  • 我最喜歡那種夕陽(yáng)已過(guò),天色漠藍(lán)嗦明,在寒冷和順的季節(jié)里笼沥,疲倦的蝴蝶心系滄海,只留稀疏的生機(jī)于枝頭娶牌。葉落無(wú)聲奔浅,密匝的枝丫...
    玉歲杳閱讀 127評(píng)論 0 1