Polkadot中的密码学
本文是一篇笔记,整理了Polkadot中使用到的密码学,主要包括:
-
密钥签名
-
加密曲线
-
地址格式
密钥
在Polkadot中,有四个加密层:
-
Account keys,帐户密钥,用于控制资金的密钥,与Polkadot上一个实际的DOT帐户绑定。可以是:
-
controller密钥,是半在线(semi-online)密钥,用于手动提交外部交易,验证人或提名人,使用它来开始或停止验证或提名,仅持有一些DOT支付费用
-
stash密钥,大多数情况下是一个冷钱包的密钥,保持脱机状态,持有大量资金。
-
Session keys,会话密钥,是必须保持在线的“热”(hot)密钥,用于执行网络操作。当前使用的四种会话密钥:
-
GRANDPA: ed25519
-
BABE: sr25519
-
Online: sr25519
-
Parachain: sr25519
-
Nominator keys,提名者密钥,在已抵押/绑定的帐户密钥(stash account keys)与节点在区块生成或验证中使用的会话密钥之间,提供一个信任链,它不能转账DOT。
-
Transport layer static keys,传输层静态密钥,libp2p用来验证节点间连接的,使用会话密钥。
签名
会话密钥:
-
使用Schnorr签名的ed25519实现
-
Schnorrkel/Ristretto sr25519变体实现
会话密钥:
-
Ristretto Schnorr公钥(公钥-32字节,签名-64字节,VRF-96字节),提名者密钥,VRF区块生成
-
BLS12-381小曲线(公钥-48字节,签名-96字节),更高效的聚合(aggre gate d)签名,将用于GRANDPA中
-
BLS12-381大曲线(公钥-96字节,签名-48字节)
-
传输层身份验证密钥
Polkadot的帐户主要使用带有Schnorr签名的公钥,Polkadot认为它满足:
-
在比特币Schnorr愿望清单提到的支持多重签名
-
较快的签名,批量验证比ECDSA更简单,以及更自然的阈值
-
支付通道用到的技巧
-
改善区块验证
-
和极其安全的Ed25519或secp256k1曲线一起工作得很好
加密曲线
区块链中的账户通常有两种曲线选择:secp256k1或Ed25519。
Polkadot对secp256k1密钥有最小化支持,其一些帐户需要用到secp256k1密钥。
Polkadot选择Ed25519(Edwards曲线),有两个理论上的原因:
-
secp256k1有较小的CM(complex multiplication,虚数乘法)域判定
-
secp256k1具有相当严格的参数选择,但不是绝对最好的
地址格式
在Polkadot采用SS58地址格式。SS58是一个简单的地址格式,设计用于基于Substrate开发的链。对于链使用其他地址格式没有问题,但这是可靠的默认设置。它很大程度上基于 比特币 的Base-58检查格式,并做了一些改动。
基本思想是一个base-58编码的值,它可以标识Substrate链上的一个特定帐户。不同的链有不同的识别账户的方法。因此,SS58被设计为可扩展的。
其基本的格式为:
base58encode ( concat ( <address-type>, <address>, <checksum> ) )
可在Substrate GitHub Wiki上找到SS58地址格式的实时规范。
椭圆曲线库
-
Ed25519
-
ed25519-dalek
-
Github:https://github.com/dalek-cryptography/ed25519-dalek
-
Sr25519
-
schnorrkel
-
Github:https://github.com/w3f/schnorrkel
-
BIP39
-
substrate-bip39
-
Github:https://github.com/paritytech/substrate-bip39
加密哈希函数库
-
blake2
-
blake2-rfc
-
Github:https://github.com/cesarb/blake2-rfc
-
SHA-3
-
tiny-keccak
-
Github:https://github.com/debris/tiny-keccak
术语
-
Ed25519,elliptic-curve signatures,
-
Sr25519,Schnorr-like signature,
-
HSM,Hardware Security Module,硬件安全模块
-
HDKD,Hierarchical Deterministic Key Derivation,分层确定性密钥推导
-
NIZK,Non-Interactive Zero-Knowledge,非交互零知识
-
zk-SNARK,Zero-Knowledge Succinct Non-interactive Argument of Knowledge,简洁非交互知识论证
-
VRF,Verifialbe Random Function,可验证的随机函数
-
PBKDF2,Password-Based Key Derivation Function 2,基于密码的密钥推导函数
-
Argon2,密钥推导函数