本节介绍多签账户的使用,包括如何创建通过 cli 在链上创建多签账户,以及如何发起多签交易。
前置准备
多签交易涉及到多个参与者。这里我们用 alice, bob, tom 三个参与者来说明多签交易的流程。
- 首先你需要在本地启动三个 starcoin dev 节点,分别对应到 alice,bob,tom。并同时连接到 console 中。
--discover-local
参数可以让节点发现本地局域网内的其他节点,然后连接成一个网络。
% starcoin -n dev -d alice --discover-local true console
% starcoin -n dev -d bob --discover-local true console
% starcoin -n dev -d tom --discover-local true console
- 通过以下命令各自生成一个公私钥对
%starcoin account generate-keypair
这里假设他们三者生成对私钥信息(只用于举例,请勿使用在正式网络中)分别是:
alice:
- address: 0x662275a33c99a1e3f4d1dd3bf712470f
- pubkey: 0x6cbe3fb3639a98fc5b8637b8280a8d5bb927b50fa2e2cdfa53a5de9395c03034
- prikey: 0x48d097cb7dafea94c0310c6c02bba075955913bf2d356faffbf9adc6fc6d8e1a
bob:
- address: 0x51888ec9961c09db913bfe2bfacd8ec1
- authkey: 0x951d6a3008eec3b0add413a622514d5c51888ec9961c09db913bfe2bfacd8ec1
- pubkey: 0x2ffe29f29064bf839c3194bf852b00f35fd9351afb602832ae64a754e8c2b584
- prikey: 0x744dcfb091bce98d5aeec1e28471251a526d1b4a6240db1ec50655a285703bac
tom:
- address: 0x49ea9eb68253cde31bf4cda26d640a21
- pubkey: 0x3db1b2a0172f8fb857afc5abebd98ecf969a2fcf2ba90e4b759ebc3da7064066
- prikey: 0x74f6c2f05a7b369351a21af3afd05d94aed5b254269c5f149a23a4a600a202c0
- 最后在 Starcoin faucet 分别给 alice, bob, tom 账户充钱。
做完上述准备后,下面开始我们的多签交易流程。主要步骤如下:
- 首先我们在本地创建一个多签账户。
- 然后从 alice 向这个多签账户转一笔钱。
- 最后以这个多签账户的名义发起一个多签交易:从多签账户给 bob 转账。
生成多签账户
这里假设读者了解多签账户的基本概念。
这一小节里,我们会创建由 三个 参与者共同维护的多签账户,交易只需要其中两个参与者的签名即可( threshold=2
)。
然后我们从这三个公钥以及 threshold=2
来生成多签账户的地址信息。
首先分别在 alice,bob,tom 的节点中生成三人共同维护的多签账户。
在 alice 的 console 中执行:
starcoin% account import-multisig --pubkey 0x2ffe29f29064bf839c3194bf852b00f35fd9351afb602832ae64a754e8c2b584 --pubkey 0x3db1b2a0172f8fb857afc5abebd98ecf969a2fcf2ba90e4b759ebc3da7064066 --prikey 0x48d097cb7dafea94c0310c6c02bba075955913bf2d356faffbf9adc6fc6d8e1a -t 2
在 bob 的 console 中执行:
starcoin% account import-multisig --pubkey 0x6cbe3fb3639a98fc5b8637b8280a8d5bb927b50fa2e2cdfa53a5de9395c03034 --pubkey 0x3db1b2a0172f8fb857afc5abebd98ecf969a2fcf2ba90e4b759ebc3da7064066 --prikey 0x744dcfb091bce98d5aeec1e28471251a526d1b4a6240db1ec50655a285703bac -t 2
在 tom 的 console 中执行:
starcoin% account import-multisig --pubkey 0x6cbe3fb3639a98fc5b8637b8280a8d5bb927b50fa2e2cdfa53a5de9395c03034 --pubkey 0x2ffe29f29064bf839c3194bf852b00f35fd9351afb602832ae64a754e8c2b584 --prikey 0x74f6c2f05a7b369351a21af3afd05d94aed5b254269c5f149a23a4a600a202c0 -t 2
你会发现,三个命令会生成相同的多签地址信息。
starcoin% account show 0xdec266f6749fa0b193f3a7f89d3cd9f2
{
"ok": {
"account": {
"address": "0xdec266f6749fa0b193f3a7f89d3cd9f2",
"is_default": false,
"public_key": "0x2ffe29f29064bf839c3194bf852b00f35fd9351afb602832ae64a754e8c2b5843db1b2a0172f8fb857afc5abebd98ecf969a2fcf2ba90e4b759ebc3da70640666cbe3fb3639a98fc5b8637b8280a8d5bb927b50fa2e2cdfa53a5de9395c0303402"
},
"auth_key": "0x0ed57ae832f34fc5b1a744c7c7f65e5fdec266f6749fa0b193f3a7f89d3cd9f2",
"receipt_identifier": "stc1pmmpxdan5n7stryln5luf60xe7gc7dfz6",
"sequence_number": null,
"balances": {}
}
}
给多签账户打钱
这一小节,我们从 tom 账户给这个多签账户转 1000 个 STC。
在 tom 的 starcoin console 中执行:
starcoin% account execute-function -b --function 0x1::TransferScripts::peer_to_peer_v2 -t 0x1::STC::STC --arg 0xdec266f6749fa0b193f3a7f89d3cd9f2 --arg 1000000000000u128
再查看多签账户的信息:
starcoin% account show 0xdec266f6749fa0b193f3a7f89d3cd9f2
{
"ok": {
"account": {
"address": "0xdec266f6749fa0b193f3a7f89d3cd9f2",
"is_default": false,
"public_key": "0x2ffe29f29064bf839c3194bf852b00f35fd9351afb602832ae64a754e8c2b5843db1b2a0172f8fb857afc5abebd98ecf969a2fcf2ba90e4b759ebc3da70640666cbe3fb3639a98fc5b8637b8280a8d5bb927b50fa2e2cdfa53a5de9395c0303402"
},
"auth_key": "0x0ed57ae832f34fc5b1a744c7c7f65e5fdec266f6749fa0b193f3a7f89d3cd9f2",
"receipt_identifier": "stc1pmmpxdan5n7stryln5luf60xe7gc7dfz6",
"sequence_number": 0,
"balances": {
"STC": 1000000000000
}
}
}
发起多签交易
现在多签账户有了 1000 STC。
我们来发起一个多签交易:从多签账户往 bob 转账 1 个 STC。
在 tom 的 starcoin console 中执行:
starcoin% account sign-multisig-txn -s 0xdec266f6749fa0b193f3a7f89d3cd9f2 --function 0x1::TransferScripts::peer_to_peer_v2 -t 0x1::STC::STC --arg 0x51888ec9961c09db913bfe2bfacd8ec1 --arg 1000000000u128
mutlisig txn(address: 0xdec266f6749fa0b193f3a7f89d3cd9f2, threshold: 2): 1 signatures collected
still require 1 signatures
{
"ok": "/Users/starcoin/projects/starcoinorg/starcoin/5e764f83.multisig-txn"
}
其中 peer_to_peer_v2
脚本参数:
0x51888ec9961c09db913bfe2bfacd8ec1
是 bob 地址。1000000000u128
是要发送的 token 数量。
该命令会生成原始交易,并用 alice 的私钥签名,生成的 txn 会以文件形式保存在当前目录下,文件名是 txn 的 short hash。
命令行提示:该多签交易还需要一个签名。 那么需要将生成的 txn 文件分发给该多签账户的其他参与者去签名。
ALICE 签名
alice 拿到上述的交易文件后,在自己的 starcoin cosole 中签名:
starcoin% account sign-multisig-txn /Users/starcoin/projects/starcoinorg/starcoin/5e764f83.multisig-txn
mutlisig txn(address: 0xdec266f6749fa0b193f3a7f89d3cd9f2, threshold: 2): 2 signatures collected
enough signatures collected for the multisig txn, txn can be submitted now
{
"ok": "/Users/starcoin/projects/starcoinorg/starcoin/194d547f.multisig-txn"
}
该命令会生成另一个交易文件,包含有 tom 和 alice 的签名。 返回信息提示用户,该多签交易已经收集到足够多的签名,可以提交到链上执行了。
提交多签交易
多签交易完整生成后,任何人都可以将其提交到链上。 这里我们从 alice 的 starcoin console 中提交该多签交易。
starcoin% account submit-multisig-txn /Users/starcoin/projects/starcoinorg/starcoin/194d547f.multisig-txn
{
"ok": "0x194d547f06018c0bad6312db0dae75ce4dd26afd302410a9647e5720e395878a"
}
等待10秒,再查看多签账户的信息,会发现多签账户的余额已经减少了(gas 费用和转出去的 1 stc), sequence number 也变成了 1,说明交易已经执行成功了。
starcoin% account show 0xdec266f6749fa0b193f3a7f89d3cd9f2
{
"ok": {
"account": {
"address": "0xdec266f6749fa0b193f3a7f89d3cd9f2",
"is_default": false,
"public_key": "0x2ffe29f29064bf839c3194bf852b00f35fd9351afb602832ae64a754e8c2b5843db1b2a0172f8fb857afc5abebd98ecf969a2fcf2ba90e4b759ebc3da70640666cbe3fb3639a98fc5b8637b8280a8d5bb927b50fa2e2cdfa53a5de9395c0303402"
},
"auth_key": "0x0ed57ae832f34fc5b1a744c7c7f65e5fdec266f6749fa0b193f3a7f89d3cd9f2",
"receipt_identifier": "stc1pmmpxdan5n7stryln5luf60xe7gc7dfz6",
"sequence_number": 1,
"balances": {
"STC": 998998928221
}
}
}
结语
至此,你已经完成了一个多签账户的创建以及多签交易的生成和链上执行。