多簽
了解如何使用密鑰環多重簽名生成、簽署和廣播交易。
多重簽名賬戶是一種帶有特殊密鑰的 Dst 賬戶,需要多個簽名才能簽署交易。 這對於提高帳戶的安全性或需要多方同意才能進行交易很有用。 可以通過指定以下內容來創建多重簽名帳戶:
- 所需簽名的閾值數量
- 參與簽名的公鑰
要使用多重簽名賬戶簽名,交易必須由為該賬戶指定的不同密鑰單獨簽名。然後,簽名將被組合成一個多重簽名,可用於簽署交易。如果存在的簽名數量少於所需的閾值數量,則由此產生的多重簽名被視為無效。
生成多簽密鑰對
stcd keys add --multisig=name1,name2,name3[...] --multisig-threshold=K new_key_name
K
是必須簽署帶有公鑰地址作為簽名者的交易的最小私鑰數量。
--multisig
標誌必須包含公鑰的名稱,這些公鑰將組合成一個公鑰,該公鑰將在本地數據庫中生成並存儲為 new_key_name
。
通過 --multisig
提供的所有名稱必須已經存在於本地數據庫中。
除非設置了標誌 --nosort
,否則在命令行上提供鍵的順序無關緊要,即以下命令生成兩個相同的鍵:
stcd keys add --multisig=p1,p2,p3 --multisig-threshold=2 multisig_address
stcd keys add --multisig=p2,p3,p1 --multisig-threshold=2 multisig_address
多重簽名地址也可以即時生成並通過命令打印:
stcd keys show --multisig-threshold=K name1 name2 name3 [...]
簽名交易
Step 1: 創建多簽密鑰
假設您有 test1
和 test2
想要使用 test3
創建一個多重簽名帳戶。
首先查看 test3
的公鑰。
stcd.exe keys show test3 --output json
以下为test3
的账户信息
{
"name":"test3",
"type":"local",
"address":"dst1xe6xf2t9krt0694alapp9w095g5elyqj6tchpv",
"pubkey":"{\"@type\":\"/ethermint.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"A+WM1PhFFV6XSI4xEdb6/l19TjUoGp4DW7m8VJk5hxbV\"}"
}
注意,公钥的内容位于pubkey属性值内,例如:
"{\"@type\":\"/ethermint.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"A+WM1PhFFV6XSI4xEdb6/l19TjUoGp4DW7m8VJk5hxbV\"}"
將 test3
的公鑰复制下来,然后導入到密鑰環。
stcd keys add \
test3 \
--pubkey "{\"@type\":\"/ethermint.crypto.v1.ethsecp256k1.PubKey\",\"key\":\"A+WM1PhFFV6XSI4xEdb6/l19TjUoGp4DW7m8VJk5hxbV\"}"
生成具有 2/3 閾值的多重簽名密鑰 multi。
stcd keys add \
multi \
--multisig=test1,test2,test3 \
--multisig-threshold=2
你可以看到它的地址和詳細信息:
stcd keys show multi
- address: dst18289xqh4ej6p7sucd6car6tch87h9vket6myxu
name: multi
pubkey: '{"@type":"/cosmos.crypto.multisig.LegacyAminoPubKey","threshold":2,"public_keys":[{"@type":"/ethermint.crypto.v1.ethsecp256k1.PubKey","key":"A+WM1PhFFV6XSI4xEdb6/l19TjUoGp4DW7m8VJk5hxbV"},{"@type":"/ethermint.crypto.v1.ethsecp256k1.PubKey","key":"A3uJG64OFWiIlhjBQqIGxa/pioP10jX0gmU3Cfoet+OT"},{"@type":"/ethermint.crypto.v1.ethsecp256k1.PubKey","key":"A/wAMQvrs34IaRK6wSuRdBPJ9Ju99Csys5P3vjDGqx7b"}]}'
type: multi
讓我們向多重簽名錢包转移 10 個 DST:
stcd tx bank send \
test1 \
dst18289xqh4ej6p7sucd6car6tch87h9vket6myxu \
10000000000000000000dst \
--chain-id=daodst_7777-1 \
--gas=auto \
--broadcast-mode=block
Step 2: 創建多簽交易
我們想從我們的多重簽名賬戶發送 5 個 DST 到 dst1xe6xf2t9krt0694alapp9w095g5elyqj6tchpv
。
stcd tx bank send \
multi \
dst1xe6xf2t9krt0694alapp9w095g5elyqj6tchpv \
5000000000000000000dst \
--gas="" \
--chain-id=daodst_7777-1 \
--generate-only > unsignedTx.json
文件 unsignedTx.json
包含以 JSON 編碼的未簽名交易。
{
"body": {
"messages": [
{
"@type": "/cosmos.bank.v1beta1.MsgSend",
"from_address": "dst18289xqh4ej6p7sucd6car6tch87h9vket6myxu",
"to_address": "dst1xe6xf2t9krt0694alapp9w095g5elyqj6tchpv",
"amount": [
{
"denom": "dst",
"amount": "5000000000000000000"
}
]
}
],
"memo": "",
"timeout_height": "0",
"extension_options": [
],
"non_critical_extension_options": [
]
},
"auth_info": {
"signer_infos": [
],
"fee": {
"amount": [
{
"denom": "dst",
"amount": "1000000000000000"
}
],
"gas_limit": "200000",
"payer": "",
"granter": ""
},
"tip": null
},
"signatures": [
]
}
Step 3: 單獨簽名
使用 test1
和 test2
簽名並創建個人簽名。
stcd tx sign \
unsignedTx.json \
--multisig=dst18289xqh4ej6p7sucd6car6tch87h9vket6myxu \
--from=test1 \
--output-document=test1sig.json \
--chain-id=daodst_7777-1
stcd tx sign \
unsignedTx.json \
--multisig=dst18289xqh4ej6p7sucd6car6tch87h9vket6myxu \
--from=test2 \
--output-document=test2sig.json \
--chain-id=daodst_7777-1
Step 4: 創建多重簽名
結合簽名來簽署交易。
stcd tx multisign \
unsignedTx.json \
multi \
test1sig.json test2sig.json \
--output-document=signedTx.json \
--chain-id=daodst_7777-1
TX 現已簽署:
{
"body": {
"messages": [
{
"@type": "/cosmos.bank.v1beta1.MsgSend",
"from_address": "dst18289xqh4ej6p7sucd6car6tch87h9vket6myxu",
"to_address": "dst1xe6xf2t9krt0694alapp9w095g5elyqj6tchpv",
"amount": [
{
"denom": "dst",
"amount": "5000000000000000000"
}
]
}
],
"memo": "",
"timeout_height": "0",
"extension_options": [
],
"non_critical_extension_options": [
]
},
"auth_info": {
"signer_infos": [
{
"public_key": {
"@type": "/cosmos.crypto.multisig.LegacyAminoPubKey",
"threshold": 2,
"public_keys": [
{
"@type": "/ethermint.crypto.v1.ethsecp256k1.PubKey",
"key": "A+WM1PhFFV6XSI4xEdb6/l19TjUoGp4DW7m8VJk5hxbV"
},
{
"@type": "/ethermint.crypto.v1.ethsecp256k1.PubKey",
"key": "A3uJG64OFWiIlhjBQqIGxa/pioP10jX0gmU3Cfoet+OT"
},
{
"@type": "/ethermint.crypto.v1.ethsecp256k1.PubKey",
"key": "A/wAMQvrs34IaRK6wSuRdBPJ9Ju99Csys5P3vjDGqx7b"
}
]
},
"mode_info": {
"multi": {
"bitarray": {
"extra_bits_stored": 3,
"elems": "YA=="
},
"mode_infos": [
{
"single": {
"mode": "SIGN_MODE_LEGACY_AMINO_JSON"
}
},
{
"single": {
"mode": "SIGN_MODE_LEGACY_AMINO_JSON"
}
}
]
}
},
"sequence": "1"
}
],
"fee": {
"amount": [
{
"denom": "dst",
"amount": "1000000000000000"
}
],
"gas_limit": "200000",
"payer": "",
"granter": ""
},
"tip": null
},
"signatures": [
"CkFYWWA1mhNbp68GellgJZYMFzQTYi/BkuK3ccinQlDj8xF/rkl3HjqmKQ4D36XCSCFg3tPBsoBMxtLPfzyNeJADAApBcbAT7BsSYLZUh5502sun5FHPvQ/aMf5ziWUp2KoZnOZIhNbtgfL4IREoZv2PrGhy9RaIAOXBeSQPeHr6ANUKGgA="
]
}
Step 5: 廣播交易
stcd tx broadcast signedTx.json \
--chain-id=daodst_7777-1 \
--broadcast-mode=block