帳號
可以在不同的區塊鏈上以獨特的方式創建和表示加密錢包(或帳戶)。對於在 Daodst 上與帳戶類型交互的開發人員,在其 dApp 前端的錢包集成過程中,重要的是要了解 Daodst 上的賬戶被實施為與以太坊類型地址兼容。
創建賬號
要創建一個帳戶,您可以創建私鑰、密鑰庫文件(受密碼保護的私鑰)或助記詞(可以訪問多個私鑰的一串單詞)。
除了具有不同的安全功能外,它們之間最大的區別在於私鑰或密鑰庫文件僅創建一個帳戶。創建一個助記詞可以讓您控制許多帳戶,所有帳戶都可以使用同一個短語訪問。
Cosmos 區塊鏈與 Daodst 一樣,支持使用助記詞創建帳戶,也稱為分層確定性密鑰生成(HD 密鑰)。這允許用戶在多個區塊鏈上創建帳戶,而無需管理多個密鑰。
HD 密鑰通過獲取助記詞並將其與一條稱為派生路徑的信息組合來生成地址。區塊鏈可以在它們支持的推導路徑上有所不同。因此,要通過區塊鏈上的助記詞訪問所有賬戶,使用該區塊鏈的特定推導路徑非常重要。
代理賬戶
術語賬戶
和地址
經常互換使用來描述加密錢包。在 Cosmos SDK 中,一個賬戶指定一對公鑰(PubKey)和私鑰(PrivKey)。派生路徑定義了私鑰、公鑰和地址。
可以派生 PubKey 以生成不同格式的各種地址,這些地址用於識別應用程序中的用戶(以及其他方)。 Cosmos 鏈的常見地址形式是 bech32 格式(例如 dst1 ...)。地址也與消息相關聯以識別消息的發送者。
PrivKey 用於生成數字簽名,以證明與 PrivKey 關聯的地址批准給定消息。通過對 PrivKey 應用加密方案(稱為橢圓曲線數字簽名算法 (ECDSA))來執行證明,以生成與消息中的地址進行比較的公鑰。
Daodst 賬號
Daodst 定義了自己的自定義賬戶類型,以實現與以太坊類型地址兼容的 HD 錢包。它使用以太坊的 ECDSA secp256k1 曲線作為密鑰 (eth_secp265k1) 並滿足 EIP84 的完整 BIP44 路徑。不要將這條加密曲線與比特幣的 ECDSA secp256k1 曲線混淆。
基於 Daodst 的帳戶的根 HD 路徑是 m/44'/60'/0'/0
。 Daodst 使用 Coin type 60 來支持以太坊類型的賬戶,不像許多其他使用 Coin type 118 的 Cosmos 鏈(coin types 列表
自定義 Daodst EthAccount 滿足來自 Cosmos SDK 身份驗證模塊的 AccountI 接口,並包含以太坊類型地址所需的其他字段:
// EthAccountI represents the interface of an Daodst compatible account
type EthAccountI interface {
authtypes.AccountI
// EthAddress returns the ethereum Address representation of the AccAddress
EthAddress() common.Address
// CodeHash is the keccak256 hash of the contract code (if any)
GetCodeHash() common.Hash
// SetCodeHash sets the code hash to the account fields
SetCodeHash(code common.Hash) error
// Type returns the type of Ethereum Account (EOA or Contract)
Type() int8
}
地址和公鑰
BIP-0173 為隔離見證輸出地址定義了一種新格式,其中包含標識 Bech32 用法的人類可讀部分。 Daodst 使用以下 HRP(人類可讀前綴)作為基礎 HRP:
网络 | 主网 | 测试网 |
---|---|---|
Daodst | dst | dst |
在 Daodst 上默認可用的地址/公鑰有 3 種主要類型的 HRP:
- 帳戶的地址和密鑰,用於識別用戶(例如消息的發件人)。它們是使 eth_secp256k1 曲線得出的。
- 驗證器操作員的地址和密鑰,用於識別驗證器的操作員。它們是使 eth_secp256k1 曲線得出的。
- 共識節點的地址和密鑰,用於標識參與共識的驗證節點。它們是使用 ed25519 曲線得出的
名称 | bech32 地址前缀 | bech32 公钥前缀 | 曲线 | ** 地址字节长度** | 公钥字节长度 |
---|---|---|---|---|---|
帳戶 | dst | dstpub | eth_secp256k1 | 20 | 33(compressed) |
驗證器操作 | dstvaloper | dstvaloperpub | eth_secp256k1 | 20 | 33(compressed) |
共識節點 | dstvalcons | dstvalconspub | ed25519 | 32 |
客户的地址格式
Eth账号 可以用 Bech32 (dst1...) 和十六进制 (0x...) 格式表示,以实现以太坊的 Web3 工具兼容性.
Bech32 格式是通過 CLI 和 REST 客戶端進行 Cosmos-SDK 查詢和交易的默認格式。另一方面,十六進制格式是以太坊 common.Address 表示 Cosmos sdk.AccAddress。
- 地址 (Bech32):
dst1z3t55m0l9h0eupuz3dp5t5cypyv674jj7mz2jw
- 地址 (EIP55 16进制):
0x91defC7fE5603DFA8CC9B655cF5772459BF10c6f
- 压缩公钥:
{"@type":"/ethermint.crypto.v1.ethsecp256k1.PubKey","key":"AsV5oddeB+hkByIJo/4lZiVUgXTzNfBPKC73cZ4K1YD2"}
地址转换
stcd debug addr
可用于在十六进制和 bech32 格式之间转换地址。例如: Bech32 $ stcd debug addr dst1z3t55m0l9h0eupuz3dp5t5cypyv674jj7mz2jw
Address: [20 87 74 109 255 45 223 158 7 130 139 67 69 211 4 9 25 175 86 82]
Address (hex): 14574A6DFF2DDF9E07828B4345D3040919AF5652
Bech32 Acc: dst1z3t55m0l9h0eupuz3dp5t5cypyv674jj7mz2jw
Bech32 Val: dstvaloper1z3t55m0l9h0eupuz3dp5t5cypyv674jjn4d6nn
Hex
$ stcd debug addr 14574A6DFF2DDF9E07828B4345D3040919AF5652
Address: [20 87 74 109 255 45 223 158 7 130 139 67 69 211 4 9 25 175 86 82]
Address (hex): 14574A6DFF2DDF9E07828B4345D3040919AF5652
Bech32 Acc: dst1z3t55m0l9h0eupuz3dp5t5cypyv674jj7mz2jw
Bech32 Val: dstvaloper1z3t55m0l9h0eupuz3dp5t5cypyv674jjn4d6nn
Key 导出
我们可以使用带有标志 --bech
普通账号
$ stcd keys show dev0 --bech acc
- name: dev0
type: local
address: dst1z3t55m0l9h0eupuz3dp5t5cypyv674jj7mz2jw
pubkey: '{"@type":"/ethermint.crypto.v1.ethsecp256k1.PubKey","key":"AsV5oddeB+hkByIJo/4lZiVUgXTzNfBPKC73cZ4K1YD2"}'
mnemonic: ""
验证器
$ stcd keys show dev0 --bech val
- name: dev0
type: local
address: dstvaloper1z3t55m0l9h0eupuz3dp5t5cypyv674jjn4d6nn
pubkey: '{"@type":"/ethermint.crypto.v1.ethsecp256k1.PubKey","key":"AsV5oddeB+hkByIJo/4lZiVUgXTzNfBPKC73cZ4K1YD2"}'
mnemonic: ""
共识
$ stcd keys show dev0 --bech cons
- name: dev0
type: local
address: dstvalcons1rllqa5d97n6zyjhy6cnscc7zu30zjn3f7wyj2n
pubkey: '{"@type":"/ethermint.crypto.v1.ethsecp256k1.PubKey","key":"A/fVLgIqiLykFQxum96JkSOoTemrXD0tFaFQ1B0cpB2c"}'
mnemonic: ""
賬號查詢
您可以使用 CLI、gRPC 或
命令行界面
# NOTE: the --output (-o) flag will define the output format in JSON or YAML (text)
stcd q auth account $(stcd keys show dev0 -a) -o text
'@type': /ethermint.types.v1.EthAccount
base_account:
account_number: "0"
address: dst1z3t55m0l9h0eupuz3dp5t5cypyv674jj7mz2jw
pub_key:
'@type': /ethermint.crypto.v1.ethsecp256k1.PubKey
key: AsV5oddeB+hkByIJo/4lZiVUgXTzNfBPKC73cZ4K1YD2
sequence: "1"
code_hash: 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
Cosmos gRPC and REST
# GET /cosmos/auth/v1beta1/accounts/{address}
curl -X GET "http://localhost:10337/cosmos/auth/v1beta1/accounts/dst14au322k9munkmx5wrchz9q30juf5wjgz2cfqku" -H "accept: application/json"
JSON-RPC 要使用 Web3 检索以太坊十六进制地址,请使用 JSON-RPC eth_accounts 或 personal_listAccounts 端点
# query against a local node
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}' -H "Content-Type: application/json" http://localhost:8545
curl -X POST --data '{"jsonrpc":"2.0","method":"personal_listAccounts","params":[],"id":1}' -H "Content-Type: application/json" http://localhost:8545