跳到主要内容

多重签名认证

以下步骤演示了如何创建多重签名交易,然后使用 Bfc CLI 将其提交到本地网络。交易可以是对象的转移、包的发布或升级、SUI的支付等。要了解如何设置本地网络,请参阅连接到本地网络。

要了解有关如何使用 TypeScript SDK 创建多重签名地址和创建多重签名交易的更多信息,请参阅 SDK 文档以了解详细信息。

第1步:创建密钥​

使用以下命令为每个支持的密钥方案生成 Bfc 地址和密钥并将其添加到 bfc.keystore ,然后列出密钥。

使用 bfc client 创建不同密钥方案的BFC地址。

bfc client new-address ed25519
bfc client new-address secp256k1
bfc client new-address secp256r1

第2步:将密钥添加到 Bfc 密钥库​

使用 bfc keytool 列出您在上一步中创建的签名。

bfc keytool list

响应类似于以下内容,但显示实际地址、密钥和对等 ID:

╭────────────────────────────────────────────────────────────────────────────────────────────╮
│ ╭─────────────────┬──────────────────────────────────────────────────────────────────────╮ │
│ │ suiAddress │ <BFC-ADDRESS> │ │
│ │ publicBase64Key │ <PUBLIC-KEY> │ │
│ │ keyScheme │ ed25519 │ │
│ │ flag │ 0 │ │
│ │ peerId │ <PEER-ID> │ │
│ ╰─────────────────┴──────────────────────────────────────────────────────────────────────╯ │
│ ╭─────────────────┬──────────────────────────────────────────────────────────────────────╮ │
│ │ suiAddress │ <BFC-ADDRESS> │ │
│ │ publicBase64Key │ <PUBLIC-KEY> │ │
│ │ keyScheme │ secp256k1 │ │
│ │ flag │ 0 │ │
│ │ peerId │ <PEER-ID> │ │
│ ╰─────────────────┴──────────────────────────────────────────────────────────────────────╯ │
│ ╭─────────────────┬──────────────────────────────────────────────────────────────────────╮ │
│ │ suiAddress │ <BFC-ADDRESS> │ │
│ │ publicBase64Key │ <PUBLIC-KEY> │ │
│ │ keyScheme │ secp256r1 │ │
│ │ flag │ 0 │ │
│ │ peerId │ <PEER-ID> │ │
│ ╰─────────────────┴──────────────────────────────────────────────────────────────────────╯ │
╰────────────────────────────────────────────────────────────────────────────────────────────╯

第3步:创建多重签名地址​

要创建多重签名地址,请输入用于多重签名地址的公钥列表以及相应权重和阈值的列表(将 <VARIABLES> 替换为实际值)。

bfc keytool multi-sig-address --pks <PUBLIC-KEY-ED25519> <PUBLIC-KEY-SECPK1> <PUBLIC-KEY-SECP256R1> --weights 1 2 3 --threshold 3

响应类似于以下内容:

╭─────────────────┬────────────────────────────────────────────────────────────────────────────────────╮
│ multisigAddress │ <MULTISIG-ADDRESS> │
│ multisig │ ╭────────────────────────────────────────────────────────────────────────────────╮ │
│ │ │ ╭─────────────────┬──────────────────────────────────────────────────────────╮ │ │
│ │ │ │ address │ <BFC-ADDRESS> │ │ │
│ │ │ │ publicBase64Key │ <PUBLIC-KEY> │ │ │
│ │ │ │ weight │ 1 │ │ │
│ │ │ ╰─────────────────┴──────────────────────────────────────────────────────────╯ │ │
│ │ │ ╭─────────────────┬──────────────────────────────────────────────────────────╮ │ │
│ │ │ │ address │ <BFC-ADDRESS> │ │ │
│ │ │ │ publicBase64Key │ <PUBLIC-KEY> │ │ │
│ │ │ │ weight │ 2 │ │ │
│ │ │ ╰─────────────────┴──────────────────────────────────────────────────────────╯ │ │
│ │ │ ╭─────────────────┬──────────────────────────────────────────────────────────╮ │ │
│ │ │ │ address │ <BFC-ADDRESS> │ │ │
│ │ │ │ publicBase64Key │ <PUBLIC-KEY> │ │ │
│ │ │ │ weight │ 3 │ │ │
│ │ │ ╰─────────────────┴──────────────────────────────────────────────────────────╯ │ │
│ │ ╰────────────────────────────────────────────────────────────────────────────────╯ │
╰─────────────────┴────────────────────────────────────────────────────────────────────────────────────╯

第4步:将对象发送到多重签名地址​

此示例按照连接到本地网络中的指导,使用默认 URL 从本地网络请求 Gas。如果继续操作,请务必将 <MULTISIG-ADDR> 替换为您在上一步中收到的地址。

curl --location --request POST 'http://127.0.0.1:9123/gas' --header 'Content-Type: application/json' --data-raw "{ \"FixedAmountRequest\": { \"recipient\": \"<MULTISIG-ADDR>\" } }"

响应类似于以下内容:

{"transferred_gas_objects":[{"amount":200000,"id":"<OBJECT-ID>", ...}]}

第5步:序列化交易​

本节演示如何使用属于多重签名地址的对象并序列化要签名的传输。 tx_bytes 值可以是任何序列化交易数据,其中发送者是多重签名地址。对 bfc client -h 中支持的命令使用 --serialize-unsigned-transaction 标志( publishupgradecalltransferpaypay-all-bfcpay-bfcsplitmerge-coin ) 输出 Base64 编码的交易字节。

bfc client transfer --to <BFC-ADDRESS> --object-id <OBJECT-ID> --serialize-unsigned-transaction

Raw tx_bytes to execute: <TX_BYTES>

第6步:用两个密钥签署交易​

使用以下代码示例使用 bfc.keystore 中的两个密钥对交易进行签名。您可以使用其他工具来执行此操作,只要将其序列化为 flag || sig || pk 即可。

bfc keytool sign --address <BFC-ADDRESS> --data <TX_BYTES>

Raw tx_bytes to execute: <TX_BYTES>
Serialized signature (`flag || sig || pk` in Base64): $SIG_1

bfc keytool sign --address <BFC-ADDRESS> --data <TX_BYTES>

Raw tx_bytes to execute: <TX_BYTES>
Serialized signature (`flag || sig || pk` in Base64): $SIG_2

第7步:将各个签名组合成多重签名​

此示例演示了如何组合两个签名:

bfc keytool multi-sig-combine-partial-sig --pks <PUBLIC-KEY-1> <PUBLIC-KEY-2> <PUBLIC-KEY-3> --weights 1 2 3 --threshold 3 --sigs <SIGNATURE-1> <SIGNATURE-2>

multisig address: <MULTISIG-ADDRESS> # Informational
multisig parsed: <HUMAN-READABLE-STRUCT> # Informational
multisig serialized: <SERIALIZED-MULTISIG>

您只需要权重总和为 >=k 的参与签名者的签名。您必须提供所有公钥及其权重,以及定义多重签名地址的阈值。

第8步:使用多重签名执行交易​

使用 bfc client 使用多重签名执行交易:

bfc client execute-signed-tx --tx-bytes <TX_BYTES> --signatures <SERIALIZED-MULTISIG>