Sui 中的加密技术:钱包规格

Sui 以下是加密货币行业广泛接受的钱包规范,作为用户管理账户密钥的一种手段。

Sui 中的加密技术:钱包规格

Sui 遵循加密货币行业广泛接受的钱包规范,例如 BIP-32(及其变体 SLIP-0010), BIP-44BIP-39.这些规范已成为加密货币行业的通用规范,是用户管理账户密钥的一种手段。

目前,Sui 接受使用 Ed25519 或 ECDSA Secp256k1 签名的交易。在Sui 钱包和 SDK 中,我们提供了一个灵活的接口,可使用各种签名方案签署交易。

让我们仔细看看我们究竟是如何应用这些规范的。


密钥衍生计划

Sui 遵循 BIP-32,用于管理支持 ECDSA Secp256k1 签名方案的钱包。

BIP-32 定义了分层确定性钱包结构,用于逻辑关联一组密钥。以这种方式对密钥进行分组,可以减少为一个用户追踪大量私钥的开销。这种方法还能让保管人在一个控制源下为每个用户账户发布不同的托管地址。

使用 BIP-32 可以将私钥推导与公钥推导分离开来,从而实现只看钱包使用案例,在这种情况下,可以推导出公钥链及其地址,而私钥则可以离线保存,以便签署。

Sui 遵循 SLIP-0010,用于管理支持 Ed25519 (EdDSA) 签名方案的钱包。

我们使用 SLIP-0010 是因为 BIP-32 最初是为具有素数阶组的 ECDSA 设计的,而 Ed25519 曲线基于h× ℓ 的组阶,其中 h 是一个小的辅助因子,ℓ 是一个 252 位的素数。这是一个高级技术细节,但 Ed25519 签名标准对私钥的低位和高位都采用了位钳制,这使得某些 BIP-32 模式与 Ed25519 不兼容。因此,SLIP-0010 规定禁止从现有用户的公钥派生新的公钥。SLIP-0010 只支持所谓的 "加固 "私钥父钥到私钥子钥的派生。

密钥衍生路径

BIP-32 规定了钱包的层级结构,而 BIP-44 则进一步规定了衍生路径的五个层级及其确切含义: m / purpose' / coin_type' / account' / change / address_index.在这种结构中,斜线表示层次结构中的新层级或子层级。

目的层一般设置为 44,与 BIP 编号相对应。不过,在Sui 中,目的层可区分不同的签名方案:44 为 Ed25519 设置,54 为 ECDSA Secp256k1 设置。虽然将目的级别设置为 44 以外的值不符合标准,但使用目的字段来区分不同的签名方案是很常见的。例如,BIP-49 和 BIP-84 就用于识别比特币中的脚本类型。我们选择 54 来表示 ECDSA Secp256k1,是因为 54 下没有现存的 BIP,可避免与任何比特币标准混淆。

  硬币类型 值与所有其他加密货币的存储库一起管理。两种签名方案都使用Sui的 注册 硬币类型784(电话键盘上的SUI )。

电话键盘.png

  帐户索引 级别通常用于在逻辑上分隔用户账户和创建特定账户类别。一些常见的用例包括

  • 托管人管理多个用户账户。
  • 用户可指定特定用途的账户,如捐款、储蓄和支出。

为支持多账户,我们建议从 0 开始递增 account_index 级别。

一般认为 普遍认为一般认为,以账户为基础的货币只定义了前三个层次、 基于UTXO的货币增加了变更和地址级定义。由于Sui的面向对象数据模型既不是 UTXO 也不是基于账户的(事实上它结合了两者),因此它采用了所有五个级别,以实现最大的兼容性。

总而言之:

 

推导路径表

说明

Ed25519m/44'/784'/{account}'/{change}'/{address}'衍生路径的每一级都经过加固。
ECDSA Secp256k1M/54'/784'/{account}'/{change}/{address}前三级已硬化。


记忆法支持

一旦我们定义了从种子中提取主密钥的确定性方法,就会引入 BIP-39,利用助记符使种子更易于人类阅读和记忆。Sui 接受 BIP-39 中的 12、15、18、21 和 24 个单词。 词表经过适当校验和的 12、15、18、21 和 24 个单词,分别对应 128、160、192、224 和 256 位熵。

关键管理Sui

Sui 通过其 Typescript SDK和命令行界面 (CLI),支持密钥对生成和相关的助记符。SDK 还提供其他功能,包括事务签名和 RPC 集成。

在此,我们将演示如何

  • 从助记符推导密钥对
  • 获取其地址
  • 用它来签署序列化的键入事务(或任何数据)
  • 针对 RPC 提供程序执行
Typescript SDK
import { Ed25519Keypair, JsonRpcProvider, RawSigner } from '@mysten/sui.js';
const TEST_MNEMONICS = 'a 12-24 word mnemonics strings separated by space, from the wordlist';
// Create a keypair under Ed25519 scheme.
const keypair_ed25519 = Ed25519Keypair.deriveKeypair(TEST_MNEMONICS, "m/44'/784'/0'/0'/0'");
// Create a keypair under ECDSA secp256k1 scheme.
const keypair_secp256k1 = Secp256k1Keypair.deriveKeypair(TEST_MNEMONICS, "m/54'/784'/0'/0/0");
// Create a signer with the keypair with a provider.
const signer = new RawSigner(
 keypair_ed25519, // or use keypair_secp256k1 for ECDSA secp256k1
 new JsonRpcProvider('<https://gateway.devnet.sui.io:443>')
);
// Get the address.
const address = signer.getAddress();
console.log('address', address);
// Sign some random data.
const signData = new Base64DataBuffer(
 new TextEncoder().encode('hello world')
);
const { signature, pubKey } = await signer.signData(signData)
console.log('signature', signature);
// Sign a typed data, i.e. a transfer object.
const transferTxn = await signer.transferObject({
 objectId: '0x5015b016ab570df14c87649eda918e09e5cc61e0',
 gasBudget: 1000,
 recipient: '0xd84058cb73bdeabe123b56632713dcd65e1a6c92',
});
console.log('transferTxn', transferTxn);


命令行界面


# Import mnemonics to sui.keystore with a scheme and a derivation path. 
sui keytool import "SOME_MNEMONICS" ed25519 "m/44'/784'/0'/0'/0'" 
2022-09-13T20:34:31.672453Z  INFO sui::keytool: Key imported for address [SOME_ADDRESS]
sui keytool import "SOME_MNEMONICS" secp256k1 "m/54'/784'/0'/0/1"
2022-09-13T20:37:06.849647Z  INFO sui::keytool: Key imported for address [SOME_ADDRESS]
# Generate random mnemonics and save to sui.keystore with a scheme and a derivation path. 
sui client new-address ed25519 "m/54'/784'/0'/0'/1'"
Created new keypair for address with scheme Secp256k1: [SOME_ADDRESS]
Secret Recovery Phrase : [SOME_MNEMONICS]
sui client new-address secp256k1 "m/54'/784'/0'/0/1"
Created new keypair for address with scheme Secp256k1: [SOME_ADDRESS]
Secret Recovery Phrase : [SOME_MNEMONICS]
# Set the generated address to active in keystore.
sui client switch --address 0x8e2591958b19311ece3d748852f4693908be8b3c
# Get some gas objects.
sui client gas --address 0x8e2591958b19311ece3d748852f4693908be8b3c
                Object ID                  |  Gas Value
----------------------------------------------------------------------
0xba561fb82aa38075be60c0fad30e0c6b615c0f2e |  10000000
# Transfer an object to another address, signed with the active address in keystore. Success!
sui client transfer --gas-budget 1000 --to 0x1f7633037b5e185e162f51fca142fb6e8ebe50df --object-id 0xba561fb82aa38075be60c0fad30e0c6b615c0f2e
Transfer confirmed after 494589 us
----- Certificate ----
Transaction Hash: f4ntyDJrO7HfAiZtit1zprhqftyOj5nvpo+WitB5IEU=
Transaction Signature: AA==@G7ur/HpC3AuOmyeLBFtccptvstApuDEGChsHKzasF+JJvPg+B+jmRTvfkL8E2ACpW7DD4E83Hom8YOs2EzNXDw==@6TODHwm39WE6p+z1ulDzlbZdTA/i31ZHKIsAc5u7kNw=
Signed Authorities Bitmap: RoaringBitmap<[0, 1, 3]>
Transaction Kind : Transfer Object
Recipient : 0x1f7633037b5e185e162f51fca142fb6e8ebe50df
Object ID : 0xba561fb82aa38075be60c0fad30e0c6b615c0f2e
Version : SequenceNumber(2)
Object Digest : H60tIWie9FU/BfyYDmrMgrlltQA5A/4S5YP6lITbwqs=
----- Transaction Effects ----
Status : Success
Mutated Objects:
 - ID: 0xba561fb82aa38075be60c0fad30e0c6b615c0f2e , Owner: Account Address ( 0x1f7633037b5e185e162f51fca142fb6e8ebe50df )
 - ID: 0xbf8112a6abee9fd77fda6529aa0ec97fc735791a , Owner: Account Address ( 0x8e2591958b19311ece3d748852f4693908be8b3c )


最先进的钱包大楼

钱包必须既安全又便于所有者使用。我们依靠行业标准来指导用户钱包的设计,同时在探索不同的签名方案时保持灵活敏捷。

除了目前支持的钱包规格外,我们还在不断创新钱包设计,使Sui 的交互更安全、更易用。我们将很快分享我们在钱包预批准交易方面的设计。Sui 钱包不需要一个一个地签署交易,而是让链上游戏成为现实,充分释放Sui 网络快速执行的潜力。