多重簽名技術(shù)介紹
多重簽名技術(shù)(mulTIsig)就是多個(gè)用戶同時(shí)對(duì)一個(gè)數(shù)字資產(chǎn)進(jìn)行簽名??梢院?jiǎn)單的理解為,一個(gè)賬戶多個(gè)人擁有簽名權(quán)和支付權(quán)。
如果一個(gè)地址只能由一個(gè)私鑰簽名和支付,表現(xiàn)形式就是1/1;而多重簽名的表現(xiàn)形式是m/n,也就是說一共n個(gè)私鑰可以給一個(gè)賬戶簽名,而當(dāng)m個(gè)地址簽名時(shí),就可以支付一筆交易。所以,m一定是小于等于n的。
舉幾個(gè)例子:
多重簽名2/3,表示3個(gè)人擁有簽名權(quán),而兩個(gè)人簽名就可以支付這個(gè)賬戶里的比特幣;
多重簽名1/2,表示2個(gè)人可以簽名,兩個(gè)人擁有私鑰,誰都可以來支配這筆資金。
多重簽名技術(shù)的原理并不是很復(fù)雜,但它增加了第三方的介入保障,可以實(shí)現(xiàn)現(xiàn)實(shí)場(chǎng)景中需要第三方介入的很多的應(yīng)用場(chǎng)景。與傳統(tǒng)的第三方介入不同的是,這個(gè)介入必須是交易之前就提前確定好的,而事后是不能進(jìn)行改變的。
流程以下以 metaverse 元界公鏈 cli 命令作為演示范例。
每一個(gè)參與者通過 getpublickey 獲得某個(gè)地址的公鑰,該公鑰對(duì)應(yīng)的私鑰用于簽名隨后創(chuàng)建的多重簽名交易,并把該公鑰告知其他所有參與者;
每一個(gè)參與者各自通過 getnewmulTIsig 使用自己的公鑰創(chuàng)建簽名約束條件相同(即相同的m,n以及公鑰列表)的多重簽名,得到相同的以3開頭的多重簽名地址:“支付到腳本哈希”模式 P2SH(Pay-to-Script-Hash);
某個(gè)參與者通過 createmulTIsigtx 使用多重簽名地址發(fā)起一筆多重簽名交易;可以使用 decoderawtx 命令查看該交易詳情;
m個(gè)參與者依次通過 signmulTIsigtx 對(duì)多重簽名交易進(jìn)行簽名,每一個(gè)參與者通過鏈下的方式從前一個(gè)簽名參與者獲得已部分簽名的交易;
通過 sendrawtx 廣播擁有足夠多簽名的多重簽名交易。
范例
該范例涉及到三個(gè)用戶:test,testam 以及kesalin。
1. 獲取和傳播公鑰
每一個(gè)參與者通過 getpublickey 獲得某個(gè)地址的公鑰,該公鑰對(duì)應(yīng)的私鑰用于簽名隨后創(chuàng)建的多重簽名交易,并把該公鑰告知其他所有參與者。
// testam 獲取公鑰
命令:
./mvs-cli getpublickey testam testam "MCJ6vpdCYsVD34XFC22fhqDLfHo7ZtnyM2"
輸出:
{
"address" : "MCJ6vpdCYsVD34XFC22fhqDLfHo7ZtnyM2",
"public-key" : "03d29f0b96f332e50d6014cb91c334214ecb8caf2881a97e7d944bdf4e5fd6a39e"
}
// kesalin 獲取公鑰
命令:
./mvs-cli getpublickey kesalin kesalin MHaKHUFwAdcszvQarCmn1Rkq2uRoPQjZwm
輸出:
{
"address" : "MHaKHUFwAdcszvQarCmn1Rkq2uRoPQjZwm",
"public-key" : "03f97e079ccae21e1ee65d5ee64e5c27d7d6ce9a867cec75e9736ad5f258329e02"
}
// test 獲取公鑰
命令:
./mvs-cli getpublickey test 123456 MKXa7mtzNaGCEF9vM2sUmmTS93iDpHYd4m
輸出:
{
"address" : "MKXa7mtzNaGCEF9vM2sUmmTS93iDpHYd4m",
"public-key" : "02729cae0c16009f44440f306b76fafb7a7d2503741a619c15b41ff927c1afd6b9"
}
2. 創(chuàng)建多重簽名
每一個(gè)參與者各自通過 getnewmultisig 使用自己的公鑰創(chuàng)建簽名約束條件相同(即相同的m,n以及公鑰列表)的多重簽名,得到相同的以3開頭的多重簽名地址。
范例中每一個(gè)參與者通過 -s 指定自己的公鑰以及 -k 指定其他參與者的公鑰創(chuàng)建 m:n 為 2:3 的多重簽名,得到相同的多重簽名地址 "39hh1NY9xyTKzawD8zFKXgXa7XBwqck6BR"
// testam 創(chuàng)建多重簽名
命令:
./mvs-cli getnewmultisig testam testam -m 2 -n 3 -s "03d29f0b96f332e50d6014cb91c334214ecb8caf2881a97e7d944bdf4e5fd6a39e" -k "03f97e079ccae21e1ee65d5ee64e5c27d7d6ce9a867cec75e9736ad5f258329e02" -k "02729cae0c16009f44440f306b76fafb7a7d2503741a619c15b41ff927c1afd6b9" -d "multisig test"
輸出:
{
"address" : "39hh1NY9xyTKzawD8zFKXgXa7XBwqck6BR",
"description" : "multisig test",
"index" : 1,
"m" : 2,
"multisig-script" : "2 [ 02729cae0c16009f44440f306b76fafb7a7d2503741a619c15b41ff927c1afd6b9 ] [ 03d29f0b96f332e50d6014cb91c334214ecb8caf2881a97e7d944bdf4e5fd6a39e ] [ 03f97e079ccae21e1ee65d5ee64e5c27d7d6ce9a867cec75e9736ad5f258329e02 ] 3 checkmultisig",
"n" : 3,
"public-keys" :
[
"02729cae0c16009f44440f306b76fafb7a7d2503741a619c15b41ff927c1afd6b9",
"03d29f0b96f332e50d6014cb91c334214ecb8caf2881a97e7d944bdf4e5fd6a39e",
"03f97e079ccae21e1ee65d5ee64e5c27d7d6ce9a867cec75e9736ad5f258329e02"
],
"self-publickey" : "03d29f0b96f332e50d6014cb91c334214ecb8caf2881a97e7d944bdf4e5fd6a39e"
}
// kesalin 創(chuàng)建多重簽名
命令:
./mvs-cli getnewmultisig kesalin kesalin -m 2 -n 3 -s "03f97e079ccae21e1ee65d5ee64e5c27d7d6ce9a867cec75e9736ad5f258329e02" -k "03d29f0b96f332e50d6014cb91c334214ecb8caf2881a97e7d944bdf4e5fd6a39e" -k "02729cae0c16009f44440f306b76fafb7a7d2503741a619c15b41ff927c1afd6b9" -d "multisig test"
輸出:
{
"address" : "39hh1NY9xyTKzawD8zFKXgXa7XBwqck6BR",
"description" : "multisig test",
"index" : 1,
"m" : 2,
"multisig-script" : "2 [ 02729cae0c16009f44440f306b76fafb7a7d2503741a619c15b41ff927c1afd6b9 ] [ 03d29f0b96f332e50d6014cb91c334214ecb8caf2881a97e7d944bdf4e5fd6a39e ] [ 03f97e079ccae21e1ee65d5ee64e5c27d7d6ce9a867cec75e9736ad5f258329e02 ] 3 checkmultisig",
"n" : 3,
"public-keys" :
[
"02729cae0c16009f44440f306b76fafb7a7d2503741a619c15b41ff927c1afd6b9",
"03d29f0b96f332e50d6014cb91c334214ecb8caf2881a97e7d944bdf4e5fd6a39e",
"03f97e079ccae21e1ee65d5ee64e5c27d7d6ce9a867cec75e9736ad5f258329e02"
],
"self-publickey" : "03f97e079ccae21e1ee65d5ee64e5c27d7d6ce9a867cec75e9736ad5f258329e02"
}
// test 創(chuàng)建多重簽名
命令:
./mvs-cli getnewmultisig test 123456 -m 2 -n 3 -s "02729cae0c16009f44440f306b76fafb7a7d2503741a619c15b41ff927c1afd6b9" -k "03f97e079ccae21e1ee65d5ee64e5c27d7d6ce9a867cec75e9736ad5f258329e02" -k "03d29f0b96f332e50d6014cb91c334214ecb8caf2881a97e7d944bdf4e5fd6a39e" -d "multisig test"
輸出:
{
"address" : "39hh1NY9xyTKzawD8zFKXgXa7XBwqck6BR",
"description" : "",
"index" : 1,
"m" : 2,
"multisig-script" : "2 [ 02729cae0c16009f44440f306b76fafb7a7d2503741a619c15b41ff927c1afd6b9 ] [ 03d29f0b96f332e50d6014cb91c334214ecb8caf2881a97e7d944bdf4e5fd6a39e ] [ 03f97e079ccae21e1ee65d5ee64e5c27d7d6ce9a867cec75e9736ad5f258329e02 ] 3 checkmultisig",
"n" : 3,
"public-keys" :
[
"02729cae0c16009f44440f306b76fafb7a7d2503741a619c15b41ff927c1afd6b9",
"03d29f0b96f332e50d6014cb91c334214ecb8caf2881a97e7d944bdf4e5fd6a39e",
"03f97e079ccae21e1ee65d5ee64e5c27d7d6ce9a867cec75e9736ad5f258329e02"
],
"self-publickey" : "02729cae0c16009f44440f306b76fafb7a7d2503741a619c15b41ff927c1afd6b9"
}
3. 往多重簽名地址發(fā)送幣
參與者按照合同需求往創(chuàng)建的多重簽名地址上發(fā)送虛擬貨幣。