From 2eb9ba14e9ce0cf4e1efc7fe42f64ac23ca20296 Mon Sep 17 00:00:00 2001 From: Roy van Kaathoven Date: Mon, 18 Jun 2018 01:13:05 +0200 Subject: [PATCH] cleanup change transaction error handling --- src/client/http.js | 18 +++++--- src/lib/code.js | 89 +------------------------------------- src/utils/crypto.js | 3 +- src/utils/serialization.js | 48 ++++++++++++++++++++ 4 files changed, 63 insertions(+), 95 deletions(-) create mode 100644 src/utils/serialization.js diff --git a/src/client/http.js b/src/client/http.js index 2f71b18..ef6166b 100644 --- a/src/client/http.js +++ b/src/client/http.js @@ -75,12 +75,18 @@ class ApiClient { async sendTransaction(pk, transaction) { transaction = await this.addRef(transaction); let privateKeySigner = this.getSigner(pk); - let {hex} = await privateKeySigner.signTransaction(transaction); - let {data} = await xhr.post(`${this.apiUrl}/api/transaction`, { - transaction: hex, - }); - - return data; + try { + let {hex} = await privateKeySigner.signTransaction(transaction); + let {data} = await xhr.post(`${this.apiUrl}/api/transaction`, { + transaction: hex, + }); + + return data; + } catch(e) { + return { + success: false, + }; + } } async sendTransactionRaw(transactionHex) { diff --git a/src/lib/code.js b/src/lib/code.js index 8925edf..63b9fb0 100644 --- a/src/lib/code.js +++ b/src/lib/code.js @@ -1,9 +1,9 @@ /* eslint-disable */ + function bin2String(array) { return String.fromCharCode.apply(String, array); } -//比较两个byteArray是否相等 function arrayEquals(array1, array2) { if (array1.length != array2.length) { return false; @@ -17,7 +17,7 @@ function arrayEquals(array1, array2) { return true; } -//从base64字符串中解析TransAction对象 + function getTransActionFromBase64String(base64String) { var bytesDecode = base64DecodeFromString(base64String); var transaction = proto.protocol.Transaction.deserializeBinary(bytesDecode); @@ -25,91 +25,6 @@ function getTransActionFromBase64String(base64String) { return transaction; } -//Return a list contains contract object -//从TransAction对象中获得合约列表 -function getContractListFromTransaction(transaction) { - var raw = transaction.getRawData(); - var type = raw.getType(); - if (type != 1) { - layer.alert("Invalid transaction type !!!!" + type); - return null; - } - var contractList = raw.getContractList(); - var count = contractList.length; - if (count == 0) { - layer.alert("No contract !!!!"); - return null; - } - - array = new Array(count); - var unpack = proto.google.protobuf.Any.prototype.unpack; - while (count > 0) { - count--; - var oneContract = contractList[count]; - var any = oneContract.getParameter(); - var contarcType = oneContract.getType(); - var obje; - switch (contarcType) { - case proto.protocol.Transaction.Contract.ContractType.ACCOUNTCREATECONTRACT: - obje = any.unpack( - proto.protocol.AccountCreateContract.deserializeBinary, - "protocol.AccountCreateContract"); - break; - - case proto.protocol.Transaction.Contract.ContractType.TRANSFERCONTRACT: - obje = any.unpack( - proto.protocol.TransferContract.deserializeBinary, - "protocol.TransferContract"); - break; - - case proto.protocol.Transaction.Contract.ContractType.TRANSFERASSETCONTRACT: - obje = any.unpack( - proto.protocol.TransferAsstContract.deserializeBinary, - "protocol.TransferAssetContract"); - break; - - case proto.protocol.Transaction.Contract.ContractType.VOTEASSETCONTRACT: - obje = any.unpack( - proto.protocol.VoteAssetContract.deserializeBinary, - "protocol.VoteAssetContract"); - break; - - case proto.protocol.Transaction.Contract.ContractType.VOTEWITNESSCONTRACT: - obje = any.unpack( - proto.protocol.VoteWitnessContract.deserializeBinary, - "protocol.VoteWitnessContract"); - break; - - case proto.protocol.Transaction.Contract.ContractType.WITNESSCREATECONTRACT: - obje = any.unpack( - proto.protocol.WitnessCreateContract.deserializeBinary, - "protocol.WitnessCreateContract"); - break; - - case proto.protocol.Transaction.Contract.ContractType.ASSETISSUECONTRACT: - obje = any.unpack( - proto.protocol.AssetIssueContract.deserializeBinary, - "protocol.AssetIssueContract"); - break; - - case proto.protocol.Transaction.Contract.ContractType.DEPLOYCONTRACT: - obje = any.unpack( - proto.protocol.DeployContract.deserializeBinary, - "protocol.DeployContract"); - break; - - case proto.protocol.Transaction.Contract.ContractType.WITNESSUPDATECONTRACT: - obje = any.unpack( - proto.protocol.WitnessUpdateContract.deserializeBinary, - "protocol.WitnessUpdateContract"); - break; - } - array[count] = obje; - } - return array; -} - -//字符串转byteArray数据格式 function stringToBytes(str) { var bytes = new Array(); var len, c; diff --git a/src/utils/crypto.js b/src/utils/crypto.js index f4f2bfd..f7a27f4 100644 --- a/src/utils/crypto.js +++ b/src/utils/crypto.js @@ -223,8 +223,6 @@ function ECKeySign(hashBytes, priKeyBytes) { return hexStr2byteArray(signHex); } -//toDO: -//return 32 bytes function SHA256(msgBytes) { let shaObj = new jsSHA("SHA-256", "HEX"); let msgHex = byteArray2hexStr(msgBytes); @@ -257,4 +255,5 @@ module.exports = { pkToAddress, decode58Check, signBytes, + SHA256, }; diff --git a/src/utils/serialization.js b/src/utils/serialization.js new file mode 100644 index 0000000..182e1d2 --- /dev/null +++ b/src/utils/serialization.js @@ -0,0 +1,48 @@ +const {Transaction} = require("../protocol/core/Tron_pb"); +const Contract = require("../protocol/core/Contract_pb"); +const {Any} = require('google-protobuf/google/protobuf/any_pb.js'); + +const contractTypeMap = { + [Transaction.Contract.ContractType.ACCOUNTCREATECONTRACT]: "AccountCreateContract", + [Transaction.Contract.ContractType.TRANSFERCONTRACT]: "TransferContract", + [Transaction.Contract.ContractType.TRANSFERASSETCONTRACT]: "TransferAssetContract", + [Transaction.Contract.ContractType.VOTEASSETCONTRACT]: "VoteAssetContract", + [Transaction.Contract.ContractType.VOTEWITNESSCONTRACT]: "VoteWitnessContract", + [Transaction.Contract.ContractType.WITNESSCREATECONTRACT]: "WitnessCreateContract", + [Transaction.Contract.ContractType.ASSETISSUECONTRACT]: "AssetIssueContract", + [Transaction.Contract.ContractType.DEPLOYCONTRACT]: "DeployContract", + [Transaction.Contract.ContractType.WITNESSUPDATECONTRACT]: "WitnessUpdateContract", + [Transaction.Contract.ContractType.PARTICIPATEASSETISSUECONTRACT]: "ParticipateAssetIssueContract", + [Transaction.Contract.ContractType.ACCOUNTUPDATECONTRACT]: "AccountUpdateContract", + [Transaction.Contract.ContractType.FREEZEBALANCECONTRACT]: "FreezeBalanceContract", + [Transaction.Contract.ContractType.UNFREEZEBALANCECONTRACT]: "UnfreezeBalanceContract", + [Transaction.Contract.ContractType.WITHDRAWBALANCECONTRACT]: "WithdrawnBalanceContract", + [Transaction.Contract.ContractType.UNFREEZEASSETCONTRACT]: "UnfreezeAssetContract", + [Transaction.Contract.ContractType.UPDATEASSETCONTRACT]: "UpdateAssetContract", + [Transaction.Contract.ContractType.CUSTOMCONTRACT]: "CustomContract", +}; + +function anyToContract(any, contractType) { + let contract = contractTypeMap[contractType]; + return { + contract: any.unpack(Contract[contract].deserializeBinary, "protocol." + contract), + type: contractType, + }; +} + + +function getContractListFromTransaction(transaction) { + var raw = transaction.getRawData(); + var contractList = raw.getContractList(); + + return contractList.map(contract => { + var any = contract.getParameter(); + var contractType = contract.getType(); + return anyToContract(any, contractType); + }); +} + +module.exports = { + anyToContract, + getContractListFromTransaction, +};