Multi-Signature Example Process Flow
TronWeb allows developers to easily perform multi-signing with the tronWeb.trx.multiSign
method. The is an example of the workflow.
1. Create transaction
const originalTransaction = await tronWeb.transactionBuilder.sendTrx('41e0d5217904dcb2d5453c2359b86df9673046c4ce', 100000, '4164eb61f763d3374a998989f06929c1bad87175ba');
2. Perform the Multi-Signing
let signedTransaction = await tronWeb.trx.multiSign(originalTransaction, '47e5e1a590a44e7e6f4349a4e3ea6a4f9a791e3fccb115ffbddffdbf6d0588e6', 2);
signedTransaction = await tronWeb.trx.multiSign(signedTransaction, 'd5f244307d3ab6dc5739b83ec913b662a24f87e873190e9c1a2d9709f579540c', 2);
signedTransaction = await tronWeb.trx.multiSign(signedTransaction, '9944b7010db0d44a861bca112e40365a934727c5c17f8dfd3b9cc7b31e8aeaf1', 2);
Signature result:
{
"signature": [
"2c25a81333fd83edec33ebae16cb3dfb979cfc4ce035665953c2b61179b06cb9f0625c660947404c5a1e17331cc375579bed7295ebe6635eb30ab79e73c16e6a01",
"86cfad6c7bc086c04c27267ef4a3c5ae3ea394e05e8402713b0b7e624546b76e30518ebf897c7495b29bbb372ba94d65ba927bd48a4fa9c36e439c975b7f88f500",
"4d980f85de1a1bcc0c45fa118276a3a6319a6cf404ee68f5d460fb075bd41f6a8702e0448db2eb55cd74c4dd85d53909597eb05401a48aaa44bdb3a327e47d5001"
],
"txID": "7034c0a26ffc1010c2cba113d9685cbe464793abe0a1d0d21c2e593df7990a84",
"raw_data": {
"contract": [
{
"parameter": {
"value": {
"amount": 100000,
"owner_address": "4164eb61f763d3374a998989f06929c1bad87175ba",
"to_address": "41e0d5217904dcb2d5453c2359b86df9673046c4ce"
},
"type_url": "type.googleapis.com/protocol.TransferContract"
},
"type": "TransferContract",
"Permission_id": 2
}
],
"ref_block_bytes": "02d6",
"ref_block_hash": "cf96636fd7767b20",
"expiration": 1555454166000,
"timestamp": 1555454106555
},
"raw_data_hex": "0a0202d62208cf96636fd7767b2040f087acc2a22d5a69080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a154164eb61f763d3374a998989f06929c1bad87175ba121541e0d5217904dcb2d5453c2359b86df9673046c4ce18a08d06280270bbb7a8c2a22d"
}
The method requires passing the original transaction, the private key for signing, and the permission ID. The permission ID should be generated when you update the account permission. You can overview your account permission and check the permission ID by calling the getAccount
method.
Notes: If you use active permission, we will re-calculate the transaction ID, which differs from the original transaction after tronWeb.transactionBuilder.sendTrx
or other methods.
3. Check Transaction's Sign Weight
The function tronweb.trx.getSignWeight
allows you to check how many addresses have signed the transaction and the current weight. This function can be run either during the multi-signing process or after its completion.
const signWeight = await tronWeb.trx.getSignWeight(signedTransaction, 2);
Result:
{
"result": {
},
"approved_list": [
"4164eb61f763d3374a998989f06929c1bad87175ba",
"41e0d5217904dcb2d5453c2359b86df9673046c4ce",
"41e3222fff601087f76ee803c0e09596b21282f10d"
],
"permission": {
"operations": "7fff1fc0037e0000000000000000000000000000000000000000000000000000",
"keys": [
{
"address": "4164eb61f763d3374a998989f06929c1bad87175ba",
"weight": 1
},
{
"address": "41e0d5217904dcb2d5453c2359b86df9673046c4ce",
"weight": 1
},
{
"address": "41e3222fff601087f76ee803c0e09596b21282f10d",
"weight": 1
}
],
"threshold": 3,
"id": 2,
"type": "Active",
"permission_name": "active0"
},
"current_weight": 3,
"transaction": {
"result": {
"result": true
},
"txid": "7100eddcc788b0956e0224470111bffaa99b465781a2abe75cbd2a29c82ade42",
"transaction": {
"signature": [
"bfc89f7a49fa233cfb2484c5e1fdb3c687815c68f198fc81b0cccbc1ccbb09c611d0f3d90a32d7e8dc1d85fde43c10b7cb586edde1833f7974fda42e951b94ed00",
"8c167cd077d82f5b36e1d2bbc831711523dcc71494830cee6181b1435c44b22b751d6a72b425948db8aac3fb5f736bd2f9e689e18941002cafab1ff3caeb354d01",
"64921a4760fd2b2fb8f76bb7feab50d49d6298774f120164c050f4e154d624445e9a620b051116ec674f62640adb5ff2d6b0934ba9187db1197d65f368fd5ebc00"
],
"txID": "7100eddcc788b0956e0224470111bffaa99b465781a2abe75cbd2a29c82ade42",
"raw_data": {
"contract": [
{
"parameter": {
"value": {
"amount": 100000,
"owner_address": "4164eb61f763d3374a998989f06929c1bad87175ba",
"to_address": "41e0d5217904dcb2d5453c2359b86df9673046c4ce"
},
"type_url": "type.googleapis.com/protocol.TransferContract"
},
"type": "TransferContract"
}
],
"ref_block_bytes": "03a9",
"ref_block_hash": "f04705dfcc42a285",
"expiration": 1555454799000,
"timestamp": 1555454740761
},
"raw_data_hex": "0a0203a92208f04705dfcc42a2854098d9d2c2a22d5a69080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a154164eb61f763d3374a998989f06929c1bad87175ba121541e0d5217904dcb2d5453c2359b86df9673046c4ce18a08d062802709992cfc2a22d"
}
}
}
4. Check Approved List
The function tronWeb.trx.getApprovedList
allows you to check how many addresses have already signed (approved) the transaction.
const approvedList = await tronWeb.trx.getApprovedList(signedTransaction);
Result:
{
"result": {
},
"approved_list": [
"4164eb61f763d3374a998989f06929c1bad87175ba",
"41e0d5217904dcb2d5453c2359b86df9673046c4ce",
"41e3222fff601087f76ee803c0e09596b21282f10d"
],
"transaction": {
"result": {
"result": true
},
"txid": "479d294569f9d16bb9db643383eae40d4d6df0fa081b6918cf5d831f6fcac1bc",
"transaction": {
"signature": [
"fe5eaa06536e431143612d7b967059480ade185c70ad3c7529ed72c91b74b5c705cc231a857247e5cec31cb1aceb2d9016d2fb2bf57124ec5314b2b1688d060701",
"6951c7e651fdf79102d655acd6ed57e9c2ba8d4e9b7c1486b54c7d9912bf9e58bb5a4876593532f889858e819b41bb9ae60da7693a008fff7d335da34b9088e401",
"9960d832d5d71556124ea04e783e7e15d4437c27933b90d834670d58f590a3a255d3081d12b7ddccd8a84060ad1294b0c19f9ee63fa12fd5c602695ff32f8b6300"
],
"txID": "479d294569f9d16bb9db643383eae40d4d6df0fa081b6918cf5d831f6fcac1bc",
"raw_data": {
"contract": [
{
"parameter": {
"value": {
"amount": 100000,
"owner_address": "4164eb61f763d3374a998989f06929c1bad87175ba",
"to_address": "41e0d5217904dcb2d5453c2359b86df9673046c4ce"
},
"type_url": "type.googleapis.com/protocol.TransferContract"
},
"type": "TransferContract"
}
],
"ref_block_bytes": "03e5",
"ref_block_hash": "3dfe142fc7c242bf",
"expiration": 1555454979000,
"timestamp": 1555454919646
},
"raw_data_hex": "0a0203e522083dfe142fc7c242bf40b8d7ddc2a22d5a69080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a154164eb61f763d3374a998989f06929c1bad87175ba121541e0d5217904dcb2d5453c2359b86df9673046c4ce18a08d06280270de87dac2a22d"
}
}
}
5. Broadcast Transaction
Once multi-signing completes, you can broadcast the signed transaction directly and check the transaction by using getTransactionById
later.
const result = await = tronWeb.trx.broadcast(signedTransaction);
Result:
{
"result": true,
"transaction": {
"signature": [
"9ea568d070de64ce674d9db0d1c0dddbdf83435b4e60b27860fd7a017c071f9858062671ff938600b5cbd8b3475b2ab16df4c2076654f18a928e972ce3fe5e3600",
"202db297c8b31d51e1ad9406aaad030b602af865810a58d19910858bba3825ef0143b3013b33ad15aa6680b6b735efd1b8d5a913f42ed7d04792b9200f69097401",
"5c143c98ff4f9a7837eacd8ed26320b4a5544954241ca7985d73e6d099b1f8df0667d686e9e6ab5a2ae6be62e6795523b2cf423b3fc3a88523faf2408dac753001"
],
"txID": "b25f3449384b0ea6b8c201596ed6998fb5581f4a68c5d467a268a4e60499ff1b",
"raw_data": {
"contract": [
{
"parameter": {
"value": {
"amount": 100000,
"owner_address": "4164eb61f763d3374a998989f06929c1bad87175ba",
"to_address": "41e0d5217904dcb2d5453c2359b86df9673046c4ce"
},
"type_url": "type.googleapis.com/protocol.TransferContract"
},
"type": "TransferContract",
"Permission_id": 2
}
],
"ref_block_bytes": "0412",
"ref_block_hash": "614e7424dfcf96fb",
"expiration": 1555455114000,
"timestamp": 1555455056464
},
"raw_data_hex": "0a0204122208614e7424dfcf96fb4090f6e5c2a22d5a69080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a154164eb61f763d3374a998989f06929c1bad87175ba121541e0d5217904dcb2d5453c2359b86df9673046c4ce18a08d06280270d0b4e2c2a22d"
}
}
Updated over 5 years ago