{"content":{"title":"Sui 中的密码学：钱包规范","body":"在加密货币的广阔领域中，钱包规范的遵循与应用对于保障用户资产安全及提升使用体验具有至关重要的意义。Sui 严格遵循加密货币行业内广泛认可且通用的钱包规范，以此作为用户高效管理帐户密钥的可靠方式，全力为用户打造安全、便捷的加密资产管理环境。\r\n\r\n![Cryptography in Sui: Wallet Specifications](https://blog.sui.io/content/images/size/w1200/2023/04/crypto-wallet-specs.png)\r\n\r\nSui 精准遵循诸如 BIP-32（及其变体 SLIP-0010）、BIP-44 和 BIP-39 等一系列在加密货币行业中占据重要地位且已被广泛接纳的规范。这些规范作为用户妥善管理帐户密钥的得力手段，在行业发展历程中已逐渐成为不可或缺的通行准则，为加密货币的安全存储与交易提供了坚实的基础支撑。\r\n\r\n当前，Sui 能够灵活接受采用 `Ed25519` 或 `ECDSA Secp256k1` 签名的交易，充分展现了其在技术兼容性上的优势。在 Sui Wallet 和 SDK 中，我们精心打造了功能丰富、操作灵活的接口，以便用户能够根据自身需求自由选择各种签名方案来签署交易，极大地提升了用户在交易过程中的自主性与便利性。\r\n\r\n> 译注：由于原文是 2022 年，新版本还支持 `Secp256r1`\r\n\r\n接下来，让我们以更为细致、深入的视角探究一下 Sui 是如何精准且高效地应用这些规范的。\r\n\r\n# 密钥派生方案\r\n\r\nSui 在管理支持 `ECDSA Secp256k1` 签名方案的钱包时，坚定遵循 `BIP-32` 规范。`BIP-32` 创新性地定义了分层确定性钱包结构，通过这种结构，能够以逻辑紧密的方式将一组密钥有机地关联在一起。如此一来，对密钥进行分组管理的方式显著降低了用户在跟踪大量私钥时所面临的复杂程度与管理开销，极大地提升了密钥管理的效率与安全性。同时，这种方法还为托管人提供了极大的便利，使其能够在一个统一的控制源下，为每个用户帐户精准发布不同的托管地址，进一步优化了托管服务的质量与安全性。\r\n\r\n通过运用 `BIP-32`，Sui 将私钥派生与公钥派生进行了巧妙的解耦处理，这一举措有力地支持了仅监视钱包用例的实现。在这种应用场景下，公钥链及其地址能够被顺利派生出来，而私钥则可以安全地保持离线状态，仅在需要进行签名操作时才被调用，从而最大程度地降低了私钥暴露的风险，为用户资产安全提供了全方位的保障。\r\n\r\n而在管理支持 `Ed25519 (EdDSA)` 签名方案的钱包时，Sui 则遵循 `SLIP-0010` 规范。我们之所以选择 `SLIP-0010`，是因为 BIP-32 最初是基于具有素数阶群的 ECDSA 进行设计的，而 Ed25519 曲线所基于的群阶为 h × ℓ，其中 h 是一个小辅因子，ℓ 是一个 252 - 位素数。这一技术细节虽然较为先进，但却导致了 Ed25519 签名标准在对私钥的低位和高位应用位钳位时，与某些 BIP-32 模式产生了不兼容的情况。因此，SLIP-0010 明确指定禁止从现有用户的公钥派生新的公钥，并且仅支持所谓的“强化”私有父密钥到私有子密钥的派生，以此确保了在 `Ed25519` 签名方案下钱包管理的稳定性与安全性。\r\n\r\n# 密钥导出路径\r\n\r\nBIP-32 以层次分明、结构严谨的方式规定了钱包的各级别，而 BIP-44 则在此基础上进一步细化，明确界定了派生路径的五个级别及其确切含义：\r\n```\r\nm/purpose'/coin_type'/account'/change/address_index\r\n```\r\n在这一精心设计的结构中，斜杠作为分隔符号，清晰地表示出层次结构中的新级别或子级，使得整个派生路径具有极高的可读性与可操作性。\r\n\r\n在目的级别设置方面，一般情况下会将其设定为 `44`，这一数值与 BIP 号相对应。然而，在 Sui 独特的体系中，目的级别被巧妙地用于区分不同的签名方案：`Ed25519` 被设置为 `44`，`ECDSA Secp256k1` 则被设置为 `54`。尽管将目的级别设置为 `44` 以外的值并非行业标准做法，但在实际应用中，利用目的字段来有效区分不同的签名方案已成为一种常见且实用的策略。例如，`BIP-49` 和 `BIP-84` 就在比特币的应用场景中用于精准识别脚本类型。我们之所以选择 `54` 来表示 `ECDSA Secp256k1`，是因为在 `54` 以下尚未存在现有的 BIP，这样的设置能够有效避免与任何比特币标准产生混淆，确保了 Sui 在签名方案区分上的准确性与独特性。\r\n\r\n> 译注：由于原文是 2022 年，新版本还支持 `Secp256r1`，`ECDSA Secp256r1` 算法设置为 `74`\r\n\r\n`coin_type` 值是通过所有其他加密货币的存储库进行统一管理的。在 Sui 中，无论是 `Ed25519` 还是 `ECDSA Secp256k1` 签名方案，均使用 Sui 注册的 `coin_type`，即 `784`，这一统一的设置确保了不同签名方案在货币类型识别上的一致性与兼容性。\r\n\r\n`account_index` 级别在实际应用中通常发挥着重要作用，它主要用于在逻辑层面上清晰地分隔用户帐户，从而帮助用户创建特定的帐户类别，以满足多样化的使用需求。一些常见且具有代表性的用例包括：\r\n- 对于托管人而言，能够借助这一级别高效地管理多个用户帐户，实现对不同用户资产的精准管理与监控。\r\n- 用户可以根据自身需求，将特定帐户指定用于不同的目的，例如专门用于捐赠、储蓄和日常支出等，使得资金管理更加清晰、便捷。\r\n\r\n为了更好地支持多帐户的应用场景，我们强烈建议用户从零开始，按照递增的方式对 `account_index` 级别进行合理设置，这样的操作方式能够确保帐户管理的有序性与高效性。\r\n\r\n需要注意的是，在加密货币的世界中，虽然基于账户的货币通常仅定义了前三个级别，但基于 UTXO 的货币则额外添加了找零和地址级别定义。而 Sui 所采用的面向对象数据模型具有独特的创新性，它既不属于 UTXO 模式，也不是单纯基于帐户的模式，实际上是将两者的优势进行了有机结合。因此，Sui 全面采用所有五个级别，旨在实现与不同类型货币系统的最大兼容性，为用户提供更加广泛、便捷的应用体验。\r\n\r\n### 总结\r\n\r\n| | **推导路径形式** | **备注** |\r\n| ---- | ---- | ---- |\r\n| Ed25519 | m/44'/784'/{account}'/{change}'/{address}' | 推导路径的每一层都是硬化的。 |\r\n| ECDSA Secp256k1 | m/54'/784'/{account}'/{change}/{address} | 前三个级别已硬化。 |\r\n| ECDSA Secp256r1 | m/74'/784'/{account}'/{change}/{address} | 前三个级别已硬化。 (译注：新版本） |\r\n\r\n# 助记词支持\r\n\r\n当我们成功定义了从种子导出主密钥的确定性方法之后，`BIP-39` 便应运而生，其主要作用是通过使用助记符的方式，将原本复杂的种子转化为更易于人类阅读和记忆的形式。Sui 能够精准接受 BIP-39 单词列表中经过正确校验和的 `12、15、18、21 和 24 个单词`，这些不同长度的单词组合分别对应着 `128、160、192、224 和 256 位熵`，为用户提供了多样化的助记词选择，以满足不同用户对于安全性与便捷性的个性化需求。\r\n\r\n# Sui 关键组件\r\n\r\nSui 通过其功能强大、设计精良的 Typescript SDK 和命令行界面 (CLI)，为用户提供了全面且高效的密钥对生成服务，并能够实现与助记符的精准关联。其中，SDK 更是具备诸多附加功能，涵盖了交易签名以及 RPC 集成等重要方面，为用户在加密货币的操作与管理过程中提供了一站式的解决方案。\r\n\r\n在此，我们将通过实际操作演示向大家展示如何：\r\n- 从助记词顺利导出密钥对，这一过程涉及到复杂的加密算法与技术，但 Sui 的工具能够将其简化为几个简单的步骤，让用户轻松上手。\r\n- 快速获取密钥对所对应的地址，这一地址将作为用户在加密货币世界中的独特标识，用于各种交易与操作。\r\n- 巧妙运用导出的密钥对来签署序列化类型交易（或任何数据），确保交易的安全性与合法性，防止数据被篡改或伪造。\r\n- 将签署后的交易精准地针对 RPC 提供者执行，实现交易的快速、准确提交，提升交易效率与成功率。\r\n\r\n### TypeScript SDK\r\n\r\n```typescript\r\nimport { Ed25519Keypair, JsonRpcProvider, RawSigner } from '@mysten/sui.js';\r\nconst TEST_MNEMONICS = 'a 12-24 word mnemonics strings separated by space, from the wordlist';\r\n// Create a keypair under Ed25519 scheme.\r\nconst keypair_ed25519 = Ed25519Keypair.deriveKeypair(TEST_MNEMONICS, \"m/44'/784'/0'/0'/0'\");\r\n// Create a keypair under ECDSA secp256k1 scheme.\r\nconst keypair_secp256k1 = Secp256k1Keypair.deriveKeypair(TEST_MNEMONICS, \"m/54'/784'/0'/0/0\");\r\n// Create a signer with the keypair with a provider.\r\nconst signer = new RawSigner(\r\n keypair_ed25519, // or use keypair_secp256k1 for ECDSA secp256k1\r\n new JsonRpcProvider('<https://gateway.devnet.sui.io:443>')\r\n);\r\n// Get the address.\r\nconst address = signer.getAddress();\r\nconsole.log('address', address);\r\n// Sign some random data.\r\nconst signData = new Base64DataBuffer(\r\n new TextEncoder().encode('hello world')\r\n);\r\nconst { signature, pubKey } = await signer.signData(signData)\r\nconsole.log('signature', signature);\r\n// Sign a typed data, i.e. a transfer object.\r\nconst transferTxn = await signer.transferObject({\r\n objectId: '0x5015b016ab570df14c87649eda918e09e5cc61e0',\r\n gasBudget: 1000,\r\n recipient: '0xd84058cb73bdeabe123b56632713dcd65e1a6c92',\r\n});\r\nconsole.log('transferTxn', transferTxn);\r\n```\r\n\r\n### 命令行\r\n\r\n```shell\r\n# Import mnemonics to sui.keystore with a scheme and a derivation path. \r\nsui keytool import \"SOME_MNEMONICS\" ed25519 \"m/44'/784'/0'/0'/0'\" \r\n2022-09-13T20:34:31.672453Z  INFO sui::keytool: Key imported for address [SOME_ADDRESS]\r\nsui keytool import \"SOME_MNEMONICS\" secp256k1 \"m/54'/784'/0'/0/1\"\r\n2022-09-13T20:37:06.849647Z  INFO sui::keytool: Key imported for address [SOME_ADDRESS]\r\n# Generate random mnemonics and save to sui.keystore with a scheme and a derivation path. \r\nsui client new-address ed25519 \"m/54'/784'/0'/0'/1'\"\r\nCreated new keypair for address with scheme Secp256k1: [SOME_ADDRESS]\r\nSecret Recovery Phrase : [SOME_MNEMONICS]\r\nsui client new-address secp256k1 \"m/54'/784'/0'/0/1\"\r\nCreated new keypair for address with scheme Secp256k1: [SOME_ADDRESS]\r\nSecret Recovery Phrase : [SOME_MNEMONICS]\r\n# Set the generated address to active in keystore.\r\nsui client switch --address 0x8e2591958b19311ece3d748852f4693908be8b3c\r\n# Get some gas objects.\r\nsui client gas --address 0x8e2591958b19311ece3d748852f4693908be8b3c\r\n                Object ID                  |  Gas Value\r\n----------------------------------------------------------------------\r\n0xba561fb82aa38075be60c0fad30e0c6b615c0f2e |  10000000\r\n# Transfer an object to another address, signed with the active address in keystore. Success!\r\nsui client transfer --gas-budget 1000 --to 0x1f7633037b5e185e162f51fca142fb6e8ebe50df --object-id 0xba561fb82aa38075be60c0fad30e0c6b615c0f2e\r\nTransfer confirmed after 494589 us\r\n----- Certificate ----\r\nTransaction Hash: f4ntyDJrO7HfAiZtit1zprhqftyOj5nvpo+WitB5IEU=\r\nTransaction Signature: AA==@G7ur/HpC3AuOmyeLBFtccptvstApuDEGChsHKzasF+JJvPg+B+jmRTvfkL8E2ACpW7DD4E83Hom8YOs2EzNXDw==@6TODHwm39WE6p+z1ulDzlbZdTA/i31ZHKIsAc5u7kNw=\r\nSigned Authorities Bitmap: RoaringBitmap<[0, 1, 3]>\r\nTransaction Kind : Transfer Object\r\nRecipient : 0x1f7633037b5e185e162f51fca142fb6e8ebe50df\r\nObject ID : 0xba561fb82aa38075be60c0fad30e0c6b615c0f2e\r\nVersion : SequenceNumber(2)\r\nObject Digest : H60tIWie9FU/BfyYDmrMgrlltQA5A/4S5YP6lITbwqs=\r\n----- Transaction Effects ----\r\nStatus : Success\r\nMutated Objects:\r\n - ID: 0xba561fb82aa38075be60c0fad30e0c6b615c0f2e, Owner: Account Address ( 0x1f7633037b5e185e162f51fca142fb6e8ebe50df )\r\n - ID: 0xbf8112a6abee9fd77fda6529aa0ec97fc735791a, Owner: Account Address ( 0x8e2591958b19311ece3d748852f4693908be8b3c )\r\n```\r\n\r\n# 最先进的钱包建设\r\n\r\n在加密货币领域的蓬勃发展浪潮中，钱包作为用户资产的核心管理工具，其建设水平直接关乎用户体验与资产安全。Sui 深度洞察到这一关键所在，致力于打造既安全可靠又便捷易用的钱包体系，全力引领行业的发展潮流。\r\n\r\n我们坚定地以行业标准为基石，精心雕琢用户钱包的每一处设计细节。这些标准犹如精准的罗盘，为我们指引方向，确保钱包在密钥管理、交易流程以及安全防护等各个关键环节都遵循着最佳实践路径。然而，Sui 并不满足于仅仅遵循既有标准，我们深知技术的进步永无止境，用户的需求也在不断演变。因此，在探索多样化签名方案的征程中，我们始终保持着敏锐的洞察力和高度的灵活性，如同矫健的猎豹，迅速捕捉每一个创新的机会，巧妙地将先进的技术理念融入到钱包的功能优化之中。\r\n\r\n除了持续巩固和拓展当前已成熟运用的钱包规范，Sui 在钱包设计的创新之路上更是快马加鞭、奋勇前行。我们的研发团队宛如一群匠心独运的工匠，日夜雕琢着钱包的每一项功能，力求让用户与 Sui 的交互过程如同丝般顺滑，不仅在操作上更加简便直观，而且在安全防护上坚如磐石。近期，我们即将揭开一项具有突破性意义的创新设计——钱包预先批准交易功能的神秘面纱。这一创新设计将彻底重塑传统的交易签署模式，使 Sui 钱包摆脱单次交易签署的局限，能够提前对一系列交易进行预先审批和智能安排。如此一来，无论是在链上游戏的复杂交易场景中，还是在其他各类高频交易的情境下，用户都能享受到前所未有的高效与便捷，Sui 网络快速执行的强大优势也将得以淋漓尽致地展现，为用户开启一扇通往全新加密货币体验的大门，引领他们畅享加密世界的无限可能。"},"author":{"user":"https://learnblockchain.cn/people/16052","address":"0x56af91a252c1009c5a065eac15aa2ec9a278a0dd"},"history":"bafkreihhcgdpwnocrnlp4pqbffb2ugkoywzyqh6gfmfraa4k7uybtpw7hm","timestamp":1735786801,"version":1}