【问题标题】:How to generate deterministic keys for Ethereum using Java?如何使用 Java 为以太坊生成确定性密钥?
【发布时间】:2018-03-09 20:26:32
【问题描述】:

我正在尝试为混合 BitcoinJ 和 Web3j 的以太坊创建一个确定性钱包。使用BitcoinJ 生成确定性密钥,使用Web3j 生成以太坊凭证。但是Web3j凭证生成的地址却不如预期。

String seedCode = "yard impulse luxury drive today throw farm pepper survey wreck glass federal";

// BitcoinJ
DeterministicSeed seed = new DeterministicSeed(seedCode, null, "", 1409478661L);
DeterministicKeyChain chain = DeterministicKeyChain.builder().seed(seed).build();
DeterministicKey key = chain.getKey(KeyPurpose.RECEIVE_FUNDS);
BigInteger privKey = key.getPrivKey();

// Web3j
Credentials credentials = Credentials.create(privKey.toString(16));
System.out.println("Address: " + credentials.getAddress());

输出:0x2c4186d0422d0462a48c92cd559cbc30f528855b

预期:0x72445fcFdEB1Fff79496D7Ce66089d663Ff90E26

代码中的误解在哪里?

【问题讨论】:

    标签: java cryptography ethereum bitcoinj


    【解决方案1】:

    默认情况下,bitcoinj 使用路径 m/0'/0 作为密钥链。大多数以太坊解决方案都使用 BIP44 规范中的 m/44'/60'/0'/0。这就是为什么与其他以太坊工具相比结果不如预期的原因。

    下面的代码修复了“问题”:

    String seedCode = "yard impulse luxury drive today throw farm pepper survey wreck glass federal";
    
    // BitcoinJ
    DeterministicSeed seed = new DeterministicSeed(seedCode, null, "", 1409478661L);
    DeterministicKeyChain chain = DeterministicKeyChain.builder().seed(seed).build();
    List<ChildNumber> keyPath = HDUtils.parsePath("M/44H/60H/0H/0/0");
    DeterministicKey key = chain.getKeyByPath(keyPath, true);
    BigInteger privKey = key.getPrivKey();
    
    // Web3j
    Credentials credentials = Credentials.create(privKey.toString(16));
    System.out.println(credentials.getAddress());
    

    【讨论】:

    • Italo,您能否澄清一下是否可以获得仅从扩展公钥生成的 DeterministicKey 实例的以太坊地址? (推荐用于 HD 钱包的外部地址) - 按照您的代码示例,我收到“私钥字节不可用”错误,这看起来合乎逻辑......
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2014-05-10
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多