2019独角兽企业重金招聘Python工程师标准>>>
There's a long discussion about using BIP32 (the Bitcoin HD wallet KDF) and BIP44 (the KDF path standard) for Ethereum.
It was raised that perhaps a different scheme could be useful.
How Bitcoin HD wallets work?
-
A mnemonic (i.e. a list of memorable words) is generated (see BIP39)
-
This mnemonic is converted to a seed using PBKDF2 (see BIP39)
-
The seed is used to generate root private key using SHA512-HMAC (see BIP32)
-
From this root key, sub keys are derived (see BIP32), where the node layout is set by BIP44
BIP32
What makes BIP32 useful:
- in use for multiple years and was subject to more scrutiny
- multiple implementations in multiple languages exist (with varying level of quality)
- multiple hardware solutions implement it
- can support a wallet, where the same nodes are used as keys for Bitcoin and Ethereum (bad idea)
Where BIP32 may be lacking:
- it doesn't magically make Ethereum work with those BIP32 implementations (including hardware wallets). They are pretty much catered for Bitcoin only.
- the path structure is very rigid (each path element is practically limited to 31 bits), fitting in long data (such as token addresses) feels a bit clumsy
- it is battle tested, but that doesn't mean it couldn't be improved (see this recent proposal for improving edge-cases)
Ethereum scheme
Requirements:
-
be compatible with the Bitcoin scheme as much as possible
-
use native Ethereum methods where possible
-
support per-contract (token) layouts
-
should it support the ability for outsiders to derive public keys?
-
should have a deterministic way to solve the node skipping issue (where a path would result in an invalid private key)
-
should it have a way for node discovery? (see BIP44)
Derivation paths
/general/ /contract/ / /token/ /
Where
is a counter starting from 0.
Simple derivation
It should share the same seed as output by BIP39. This means the same seed can be shared by BIP32 and this scheme.
A given private key can be calculated via: privKey = sha3(rlp([seed, [path array]]))
This doesn't satisfy points 4), 5) and 6) of the requirements.
A possible solution for 5) is to have a nonce to increment as the last parameter of the RLP if an invalid node is derived.
A possible solution for 4) is to move the nonce outside the RLP and use it via the public key derivation used in BIP32.
A wild idea for node discovery:
-
Store the derived paths in a text format (maybe JSON?) and encrypt it with a specific node
-
Store the encrypted list in IPFS/Swarm
-
Have a "namereg" to map the IPFS/Swarm address to an address of another specific node