Esempio n. 1
0
 static byte[] addChecksum(byte[] input) {
   int inputLength = input.length;
   byte[] checksummed = new byte[inputLength + 4];
   System.arraycopy(input, 0, checksummed, 0, inputLength);
   byte[] checksum = Sha256Hash.hashTwice(input);
   System.arraycopy(checksum, 0, checksummed, inputLength, 4);
   return checksummed;
 }
 @Override
 public void deserializeWalletExtension(Wallet containingWallet, byte[] data) throws Exception {
   lock.lock();
   try {
     checkState(this.containingWallet == null || this.containingWallet == containingWallet);
     this.containingWallet = containingWallet;
     NetworkParameters params = containingWallet.getParams();
     ClientState.StoredClientPaymentChannels states =
         ClientState.StoredClientPaymentChannels.parseFrom(data);
     for (ClientState.StoredClientPaymentChannel storedState : states.getChannelsList()) {
       Transaction refundTransaction =
           params
               .getDefaultSerializer()
               .makeTransaction(storedState.getRefundTransaction().toByteArray());
       refundTransaction.getConfidence().setSource(TransactionConfidence.Source.SELF);
       ECKey myKey =
           (storedState.getMyKey().isEmpty())
               ? containingWallet.findKeyFromPubKey(storedState.getMyPublicKey().toByteArray())
               : ECKey.fromPrivate(storedState.getMyKey().toByteArray());
       StoredClientChannel channel =
           new StoredClientChannel(
               Sha256Hash.wrap(storedState.getId().toByteArray()),
               params
                   .getDefaultSerializer()
                   .makeTransaction(storedState.getContractTransaction().toByteArray()),
               refundTransaction,
               myKey,
               Coin.valueOf(storedState.getValueToMe()),
               Coin.valueOf(storedState.getRefundFees()),
               false);
       if (storedState.hasCloseTransactionHash()) {
         Sha256Hash closeTxHash =
             Sha256Hash.wrap(storedState.getCloseTransactionHash().toByteArray());
         channel.close = containingWallet.getTransaction(closeTxHash);
       }
       putChannel(channel, false);
     }
   } finally {
     lock.unlock();
   }
 }
  public static byte[] hashForSignature(
      Transaction tx, int inputIndex, byte[] connectedScript, byte sigHashType) {
    byte[] serializedSig = serializeForSignature(tx, inputIndex, connectedScript, sigHashType);

    Sha256Hash hash = Sha256Hash.twiceOf(serializedSig);
    String hashHex = Utils.HEX.encode(hash.getBytes());
    // check hash against the reference implementation inside of bitcoinj
    byte[] referenceImplementation =
        tx.hashForSignature(inputIndex, connectedScript, sigHashType).getBytes();
    String referenceImplementationHex = Utils.HEX.encode(referenceImplementation);
    if (!hashHex.equals(referenceImplementationHex)) {
      logger.error("bitcoins: " + hashHex);
      logger.error("bitcoinj: " + referenceImplementationHex);
      throw new RuntimeException(
          "Difference between BitcoinJSignatureSerialization & Actual Bitcoinj\n"
              + "bitcoin-s: "
              + hashHex
              + "\n"
              + "bitcoin-j: "
              + referenceImplementationHex);
    }
    return hash.getBytes();
  }
Esempio n. 4
0
  private byte[] decryptMnemonic(byte[] entropy, String normalizedPassphrase)
      throws GeneralSecurityException {
    byte[] salt = Arrays.copyOfRange(entropy, 32, 36);
    byte[] encrypted = Arrays.copyOf(entropy, 32);
    byte[] derived =
        SCrypt.scrypt(normalizedPassphrase.getBytes(Charsets.UTF_8), salt, 16384, 8, 8, 64);
    byte[] key = Arrays.copyOfRange(derived, 32, 64);
    SecretKeySpec keyspec = new SecretKeySpec(key, "AES");

    DRMWorkaround.maybeDisableExportControls();
    @SuppressLint("GetInstance") // ECB for 256 bits is enough, and is the same that BIP38 uses
    Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");

    cipher.init(Cipher.DECRYPT_MODE, keyspec);
    byte[] decrypted = cipher.doFinal(encrypted, 0, 32);
    for (int i = 0; i < 32; i++) decrypted[i] ^= derived[i];

    byte[] hash = Sha256Hash.createDouble(decrypted).getBytes();
    if (!Arrays.equals(Arrays.copyOf(hash, 4), salt))
      throw new RuntimeException("Invalid checksum");
    return decrypted;
  }
/** @author John L. Jegutanis */
public class SimpleHDKeyChainTest {

  private SimpleHDKeyChain chain;
  private DeterministicKey masterKey;
  private final byte[] ENTROPY =
      Sha256Hash.create("don't use a string seed like this in real life".getBytes()).getBytes();

  @Before
  public void setup() {
    BriefLogFormatter.init();

    DeterministicSeed seed = new DeterministicSeed(ENTROPY, "", 0);
    masterKey = HDKeyDerivation.createMasterPrivateKey(seed.getSeedBytes());
    DeterministicHierarchy hierarchy = new DeterministicHierarchy(masterKey);
    DeterministicKey rootKey =
        hierarchy.get(ImmutableList.of(ChildNumber.ZERO_HARDENED), false, true);
    chain = new SimpleHDKeyChain(rootKey);
    chain.setLookaheadSize(10);
  }

  @Test
  public void derive() throws Exception {
    ECKey key1 = chain.getKey(SimpleHDKeyChain.KeyPurpose.RECEIVE_FUNDS);
    ECKey key2 = chain.getKey(SimpleHDKeyChain.KeyPurpose.RECEIVE_FUNDS);

    final Address address = new Address(UnitTestParams.get(), "n1bQNoEx8uhmCzzA5JPG6sFdtsUQhwiQJV");
    assertEquals(address, key1.toAddress(UnitTestParams.get()));
    assertEquals(
        "mnHUcqUVvrfi5kAaXJDQzBb9HsWs78b42R", key2.toAddress(UnitTestParams.get()).toString());
    assertEquals(key1, chain.findKeyFromPubHash(address.getHash160()));
    assertEquals(key2, chain.findKeyFromPubKey(key2.getPubKey()));

    key1.sign(Sha256Hash.ZERO_HASH);

    ECKey key3 = chain.getKey(SimpleHDKeyChain.KeyPurpose.CHANGE);
    assertEquals(
        "mqumHgVDqNzuXNrszBmi7A2UpmwaPMx4HQ", key3.toAddress(UnitTestParams.get()).toString());
    key3.sign(Sha256Hash.ZERO_HASH);
  }

  @Test
  public void deriveCoin() throws Exception {
    DeterministicHierarchy hierarchy = new DeterministicHierarchy(masterKey);
    DeterministicKey rootKey = hierarchy.get(BitcoinMain.get().getBip44Path(0), false, true);
    chain = new SimpleHDKeyChain(rootKey);

    ECKey key1 = chain.getKey(SimpleHDKeyChain.KeyPurpose.RECEIVE_FUNDS);
    ECKey key2 = chain.getKey(SimpleHDKeyChain.KeyPurpose.RECEIVE_FUNDS);

    final Address address = new Address(BitcoinMain.get(), "1Fp7CA7ZVqZNFVNQ9TpeqWUas7K28K9zig");
    assertEquals(address, key1.toAddress(BitcoinMain.get()));
    assertEquals(
        "1AKqkQM4VqyVis6hscj8695WHPCCzgHNY3", key2.toAddress(BitcoinMain.get()).toString());
    assertEquals(key1, chain.findKeyFromPubHash(address.getHash160()));
    assertEquals(key2, chain.findKeyFromPubKey(key2.getPubKey()));

    key1.sign(Sha256Hash.ZERO_HASH);

    ECKey key3 = chain.getKey(SimpleHDKeyChain.KeyPurpose.CHANGE);
    assertEquals(
        "18YvGiRqXKxrzB72ckfrRSizWeHgwRP94V", key3.toAddress(BitcoinMain.get()).toString());
    key3.sign(Sha256Hash.ZERO_HASH);

    ECKey key4 = chain.getKey(SimpleHDKeyChain.KeyPurpose.CHANGE);
    assertEquals(
        "1861TX2MbyPEUrxDQVWgV4Tp9991bK1zpy", key4.toAddress(BitcoinMain.get()).toString());
    key4.sign(Sha256Hash.ZERO_HASH);
  }

  @Test
  public void getLastIssuedKey() {
    assertNull(chain.getLastIssuedKey(KeyChain.KeyPurpose.RECEIVE_FUNDS));
    assertNull(chain.getLastIssuedKey(KeyChain.KeyPurpose.CHANGE));
    DeterministicKey extKey = chain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS);
    DeterministicKey intKey = chain.getKey(KeyChain.KeyPurpose.CHANGE);
    assertEquals(extKey, chain.getLastIssuedKey(KeyChain.KeyPurpose.RECEIVE_FUNDS));
    assertEquals(intKey, chain.getLastIssuedKey(KeyChain.KeyPurpose.CHANGE));
  }

  @Test
  public void externalKeyCheck() {
    assertFalse(chain.isExternal(chain.getKey(KeyChain.KeyPurpose.CHANGE)));
    assertTrue(chain.isExternal(chain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS)));
  }

  @Test
  public void events() throws Exception {
    // Check that we get the right events at the right time.
    final List<List<ECKey>> listenerKeys = Lists.newArrayList();
    long secs = 1389353062L;
    chain.addEventListener(
        new AbstractKeyChainEventListener() {
          @Override
          public void onKeysAdded(List<ECKey> keys) {
            listenerKeys.add(keys);
          }
        },
        Threading.SAME_THREAD);
    assertEquals(0, listenerKeys.size());
    chain.setLookaheadSize(5);
    assertEquals(0, listenerKeys.size());
    ECKey key = chain.getKey(SimpleHDKeyChain.KeyPurpose.CHANGE);
    assertEquals(1, listenerKeys.size()); // 1 event
    final List<ECKey> firstEvent = listenerKeys.get(0);
    assertEquals(1, firstEvent.size());
    assertTrue(firstEvent.contains(key)); // order is not specified.
    listenerKeys.clear();

    chain.maybeLookAhead();
    final List<ECKey> secondEvent = listenerKeys.get(0);
    assertEquals(12, secondEvent.size()); // (5 lookahead keys, +1 lookahead threshold) * 2 chains
    listenerKeys.clear();

    chain.getKey(SimpleHDKeyChain.KeyPurpose.CHANGE);
    // At this point we've entered the threshold zone so more keys won't immediately trigger more
    // generations.
    assertEquals(0, listenerKeys.size()); // 1 event
    final int lookaheadThreshold = chain.getLookaheadThreshold() + chain.getLookaheadSize();
    for (int i = 0; i < lookaheadThreshold; i++) chain.getKey(SimpleHDKeyChain.KeyPurpose.CHANGE);
    assertEquals(1, listenerKeys.size()); // 1 event
    assertEquals(1, listenerKeys.get(0).size()); // 1 key.
  }

  @Test
  public void serializeUnencryptedNormal() throws UnreadableWalletException {
    serializeUnencrypted(chain, DETERMINISTIC_WALLET_SERIALIZATION_TXT_MASTER_KEY);
  }

  @Test
  public void serializeUnencryptedChildRoot() throws UnreadableWalletException {
    DeterministicHierarchy hierarchy = new DeterministicHierarchy(masterKey);
    DeterministicKey rootKey = hierarchy.get(BitcoinTest.get().getBip44Path(0), false, true);
    SimpleHDKeyChain newChain = new SimpleHDKeyChain(rootKey);
    serializeUnencrypted(newChain, DETERMINISTIC_WALLET_SERIALIZATION_TXT_CHILD_ROOT_KEY);
  }

  public void serializeUnencrypted(SimpleHDKeyChain keyChain, String expectedSerialization)
      throws UnreadableWalletException {
    keyChain.setLookaheadSize(10);

    keyChain.maybeLookAhead();
    DeterministicKey key1 = keyChain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS);
    DeterministicKey key2 = keyChain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS);
    DeterministicKey key3 = keyChain.getKey(KeyChain.KeyPurpose.CHANGE);
    List<Protos.Key> keys = keyChain.toProtobuf();
    // 1 master key, 1 account key, 2 internal keys, 3 derived, 20 lookahead and 5 lookahead
    // threshold.
    int numItems =
        1 // master key/account key
            + 2 // ext/int parent keys
            + (keyChain.getLookaheadSize() + keyChain.getLookaheadThreshold())
                * 2 // lookahead zone on each chain
        ;
    assertEquals(numItems, keys.size());

    // Get another key that will be lost during round-tripping, to ensure we can derive it again.
    DeterministicKey key4 = keyChain.getKey(KeyChain.KeyPurpose.CHANGE);

    String sb = protoToString(keys);
    assertEquals(expectedSerialization, sb);

    // Round trip the data back and forth to check it is preserved.
    int oldLookaheadSize = keyChain.getLookaheadSize();
    keyChain = SimpleHDKeyChain.fromProtobuf(keys, null);
    assertEquals(expectedSerialization, protoToString(keyChain.toProtobuf()));
    assertEquals(key1, keyChain.findKeyFromPubHash(key1.getPubKeyHash()));
    assertEquals(key2, keyChain.findKeyFromPubHash(key2.getPubKeyHash()));
    assertEquals(key3, keyChain.findKeyFromPubHash(key3.getPubKeyHash()));
    assertEquals(key4, keyChain.getKey(KeyChain.KeyPurpose.CHANGE));
    key1.sign(Sha256Hash.ZERO_HASH);
    key2.sign(Sha256Hash.ZERO_HASH);
    key3.sign(Sha256Hash.ZERO_HASH);
    key4.sign(Sha256Hash.ZERO_HASH);
    assertEquals(oldLookaheadSize, keyChain.getLookaheadSize());
  }

  private String protoToString(List<Protos.Key> keys) {
    StringBuilder sb = new StringBuilder();
    for (Protos.Key key : keys) {
      sb.append(key.toString());
      sb.append("\n");
    }
    return sb.toString().trim();
  }

  private String checkSerialization(List<Protos.Key> keys, String filename) {
    try {
      String sb = protoToString(keys);
      String expected = Resources.toString(getClass().getResource(filename), Charsets.UTF_8);
      assertEquals(expected, sb);
      return expected;
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

  @Test(expected = IllegalStateException.class)
  public void notEncrypted() {
    chain.toDecrypted("fail");
  }

  @Test(expected = IllegalStateException.class)
  public void encryptTwice() {
    chain = chain.toEncrypted("once");
    chain = chain.toEncrypted("twice");
  }

  private void checkEncryptedKeyChain(SimpleHDKeyChain encChain, DeterministicKey key1) {
    // Check we can look keys up and extend the chain without the AES key being provided.
    DeterministicKey encKey1 = encChain.findKeyFromPubKey(key1.getPubKey());
    DeterministicKey encKey2 = encChain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS);
    assertFalse(key1.isEncrypted());
    assertTrue(encKey1.isEncrypted());
    assertEquals(encKey1.getPubKeyPoint(), key1.getPubKeyPoint());
    final KeyParameter aesKey = checkNotNull(encChain.getKeyCrypter()).deriveKey("open secret");
    encKey1.sign(Sha256Hash.ZERO_HASH, aesKey);
    encKey2.sign(Sha256Hash.ZERO_HASH, aesKey);
    assertTrue(encChain.checkAESKey(aesKey));
    assertFalse(encChain.checkPassword("access denied"));
    assertTrue(encChain.checkPassword("open secret"));
  }

  @Test
  public void encryptionNormal() throws UnreadableWalletException {
    encryption(chain);
  }

  @Test
  public void encryptionChildRoot() throws UnreadableWalletException {
    DeterministicHierarchy hierarchy = new DeterministicHierarchy(masterKey);
    DeterministicKey rootKey = hierarchy.get(BitcoinTest.get().getBip44Path(0), false, true);
    SimpleHDKeyChain newChain = new SimpleHDKeyChain(rootKey);

    encryption(newChain);
  }

  public void encryption(SimpleHDKeyChain unencChain) throws UnreadableWalletException {
    DeterministicKey key1 = unencChain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS);
    SimpleHDKeyChain encChain = unencChain.toEncrypted("open secret");
    DeterministicKey encKey1 = encChain.findKeyFromPubKey(key1.getPubKey());
    checkEncryptedKeyChain(encChain, key1);

    // Round-trip to ensure de/serialization works and that we can store two chains and they both
    // deserialize.
    List<Protos.Key> serialized = encChain.toProtobuf();
    System.out.println(protoToString(serialized));
    encChain = SimpleHDKeyChain.fromProtobuf(serialized, encChain.getKeyCrypter());
    checkEncryptedKeyChain(encChain, unencChain.findKeyFromPubKey(key1.getPubKey()));

    DeterministicKey encKey2 = encChain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS);
    // Decrypt and check the keys match.
    SimpleHDKeyChain decChain = encChain.toDecrypted("open secret");
    DeterministicKey decKey1 = decChain.findKeyFromPubHash(encKey1.getPubKeyHash());
    DeterministicKey decKey2 = decChain.findKeyFromPubHash(encKey2.getPubKeyHash());
    assertEquals(decKey1.getPubKeyPoint(), encKey1.getPubKeyPoint());
    assertEquals(decKey2.getPubKeyPoint(), encKey2.getPubKeyPoint());
    assertFalse(decKey1.isEncrypted());
    assertFalse(decKey2.isEncrypted());
    assertNotEquals(encKey1.getParent(), decKey1.getParent()); // parts of a different hierarchy
    // Check we can once again derive keys from the decrypted chain.
    decChain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS).sign(Sha256Hash.ZERO_HASH);
    decChain.getKey(KeyChain.KeyPurpose.CHANGE).sign(Sha256Hash.ZERO_HASH);
  }

  // FIXME For some reason it doesn't read the resource file
  private static final String DETERMINISTIC_WALLET_SERIALIZATION_TXT_CHILD_ROOT_KEY =
      "type: DETERMINISTIC_KEY\n"
          + "secret_bytes: \"\\023\\354\\032\\244\\374<y\\254aq\\a\\362=\\345\\204\\n^;5\\213M\\267\\311\\234\\037RkX\\235\\363ae\"\n"
          + "public_key: \"\\002T5VO\\274\\362m\\300\\320\\352\\005\\r!\\307\\024\\250\\307C\\324\\323\\215[\\232@\\254S\\270\\217\\362\\370\\214\\362\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"F\\336\\2067\\377M\\026)%\\357ZL#\\203\\320\\324\\217-\\3305\\310\\244\\n\\205\\277E\\323L\\250ww\\314\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "secret_bytes: \"\\362\\305\\242\\3637\\2748Z?]\\035s\\272\\253J\\300\\033\\250\\022r\\350\\020\\277U\\036K<\\335\\237\\333/\\303\"\n"
          + "public_key: \"\\003\\2471\\326i\\331A\\337|\\373\\276\\3214\\257\\363\\266Q\\315x\\341\\317\\200\\243\\234\\336<s}\\261\\240,\\233\\371\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"Pd\\032#\\325\\213\\332\\307\\3755\\020\\316\\276\\002\\037\\262\\241\\213\\211k\\376\\254\\220R\\351\\270\\\"\\260V\\260\\362\\257\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  issued_subkeys: 2\n"
          + "  lookahead_size: 10\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "secret_bytes: \"\\311\\327\\205Q\\005\\346\\030\\365\\026\\0331\\356\\346\\036\\234\\024\\b\\322\\202\\3726I\\351\\001 \\373\\200\\003\\260\\276\\216\\000\"\n"
          + "public_key: \"\\003\\334\\214L\\003Zq\\365\\212P\\203b~l\\367C@T\\341\\300\\216\\037\\375\\002\\224\\t=\\301:\\266l\u007F\\364\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\036\\277^\\322!\\227i^Z\\212\\347\\272\\365C\\016\\342\\371\\236a\\022\\\\\\n\\037\\304\\264\\021\\335\\344\\340=\\234T\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  issued_subkeys: 1\n"
          + "  lookahead_size: 10\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\232\u007F\\236W\\2235py\\021\\331i\\350\\026H\\235\\nO\\217\\231\\361M/}5\\211v\\023Kc\\253\\2307\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\032\\366\\331\\360\\276Yo\\243;!\\023\\005\\305\\246\\354\\337N\\203\\302\\264\\250\\355\\275\\346\\271!L\\\\\\252\\270\\364t\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 0\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\231\\254]q\\030g3\\316u\\322h\\304Ao4\\246f\\026\\266\\374\\nY\\233\\022\\034\\243\\'\\000\\030\\256\\342\\006\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\364\\201U66\\201$7l%Sy\\365]A\\265\\277&\\370\\256\\364\\347\\356\\334T\\323\\375\\347mB0\\374\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 1\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002/ \\336M\\347\\357pl@z\\204\\3240\\027\\366\\0170\\307\\337\\327\\312_$\\n\\'\\216\\237W\\017\\263bg\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"i\\206:\\003\\205BLMI\\376\\347S~\\315\\0306\\255\\274>\\220\\017\\302\\241u\\017DvD\\2662\\342\\316\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 2\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003 1\\316\\277\\355_\\343\\214}\\a\\205\\233\\325\\232\\241n\\256\\325\\300\\2369\\020\\nh\\335\\0243\\355\\362$?7\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\334(\\\\u\\022\\245\\370\\t*\\372\\315\\330\\365\\256Ms\\254J_{B\\035[f\\333\\351\\272\\261\\363\\373_\\023\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 3\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\354\\fhI\\2731\\026\\222\\v\\274\\027\\357\\327\\033X\\324\\270\\323\\252}\\314}\\221\\213\\272\\\\\\362k\\352\\334\u007F#\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"#\\351\\\"(\\t\\245\\006\\351\\354f\\334\\216(\\272\\252\\200\\226\\337\\370\\260XO\\375\\016/\\377\\306\\263yE\\222\\311\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 4\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002-7\\rx2\u007FzP\\r(B\\247\\350\\026\\205\\210w\\251G\\b\\254\\213\\000\\227\\271Q\\272\\342\\357\\304>G\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"US\\242J\\307\\2672<\\373l\\217\\200[\\316\\352\\361*~\\324\\f\\304\\267oD\\273\\300_\\340K\\247V\\370\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 5\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002Y\\260\\332\\377;T\\263\\335\\331\\004\\020kv\\207E=\\311|\\270*hP>)\\340\\272\\203LD\\036\\313\\271\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\r34\\'I\\027\\266\\272\\300\\003\\366f\\274\\333\\260\\006\\311\\3556!\\227\\216\\301\\361\\247\\354\\025\\305\\321\\376\\274\\214\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 6\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002I\\367x\\235p9\\334\\234\\034\\366\\247&\\321\\237\\217\\241V\\252\\017`w\\212\\301\\000\\305-\\312\\003\\352`\\302V\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\257\\001\\375\\203E\\315\\221W\\316&\\035\\244\\306\\037\\351\\361\\027\\020\\346\\305^Z\\274O\\212\\363P\\036\\273n\\367\\326\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 7\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\0029\\373\\030u\\305\\214S\\345/\\373y%\\t\\252~\\267\\f\\016t|\\354\\020\\356\\306\\313\\317\\027\\325\\376\\232kh\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\260\\203\\277\\231\\352\\265y\\020\\356r_bO\\374l\\347\\002\\032i\\216Ct\\260\\221-\\207\\200\\243\\364;\\247I\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 8\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002[\\304\\301.\\342\\253\\256\\364\\025\\'\\017\\356-t\\340R\\250Z\\327\\374\\250\\r\\331\\221`\\334\\362a[q\\260\\271\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\376\\277#\\275\\035S\\362`\\323\\246<b~D\\253\\250p\\263\\256\\364\\257\\256\\201\\016\\223[\\305\\261\\2758\\353\\203\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 9\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\253\\213j!\\316\\\\\\372-tA\\331\\362T\\363\\252)\\302\\2620\\246=X#\\201\\274\\212\\331Gi9\\362\\366\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"S`\\237\\003Q\\021\\201\\301\\341Ij\\\"\\270:\\335\\374;\\320\\037\\350m\\037\\331\\343\\3208\\211E\\276y\\215.\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 10\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\231\\323\\307\\3348\\267\\357\\310\\323\\nWf$\\326\\334\\v\\360\\273\\357\\207\\0207\\036)\\270Api\\346\\321\\270\\351\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\232Y6\\020\\317@\\r\\251]\\204m\\37796\\v5\\006\\300\\t\\342\\246.\\231r\\336Vt\\370\\373\\023_M\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 11\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\3647\\fs\\313\\367\\022\\317\\207\\276\\305\\370W\\b \\276\\274\\343\\344r\\351\\303\\035\\235\\227X\\a\\347Q2\\325\\351\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\030F|\\234$0\\315\\215\\203\\234\\037\\0054\\344M\\253\\343\\214S\\360\\274_\\330\\2663\\364L\\025\\250\\v\\236\\247\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 12\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\273\\t\\2539\\246\\023^H\\232\\202}Hi+\\226Q\\337\\371\\002\\021\\201\\276\\261*\\236\\353\\'\\247\\325\\367t^\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\233\\314\\253j\\213|Y\\344\\200k\\217\\357*\\\\\\030\\347`\\016\\266\\033g|\\273\\330\\261\\226cj\\204\\351\\234Z\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 0\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\266}M\\017f0\\350\\357\\232\\037\\2713\\203N\\nei\\202_\\t\\034\\0343X,\\006Y\\260\\356\\340\\031W\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\2569jU\\231\\242\\230rH\\202\\025\\356C\\373\\327\\374-\\305\\313\\277Jy5mx\\034\\350\\2264\\321\\327J\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 1\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\221o\\254\\027\\3547s\\260&\\217b\\252r\\fo)~\\2107\\016\\255\\273\\223\\245A\\234\\247ay\\204\\021H\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\265\\233\\233\\354DG\\226\\326\\215\\024\\230\\334\\262J\\257LL\\363R\\316$\\357\\347\\017v\\371rpA\\244PK\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 2\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\301\\036A\\004O\\323\\350\\240\\227>C73n\\326P]{\\260@\\327\\242\\'\\263$H\\271\\371\\371YIJ\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"9\\214\\315\\275\\300\\206\\253U;\\235\\002\u007FfA\\016\\215\\222\\235K\\253\\311\\3648w20\\2005\\343\\310\\\\:\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 3\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002!\\373+L\\341\\025\\265\\232\\a\\247J?v\\274\\273|v\\035g\\033\\211\\026\\332\\233\\37378c\\226\\020\\304\\360\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"i\\003w\\037b!Y]\\214l\\373]`x\\355Je\\\\\\v\\205\\n\\310\\254s\\301\\272\\246\\315\\024}\\366\\037\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 4\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002p\\261|\\230%\\350\\a\\347?-}\\317\\274W\\210\\032\\331\\006\\350\\320\\016\\331\\300\\024\\302\\321[O\\210E\\231\\342\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\367\\263\\236B#W\\223\\3206\\3644!?Im\\250\\277\\vY\\322\\302\\254\\212A\\227\\352\\244\\003\\031)\\374b\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 5\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\355\\213b\\333\\3157\\262iu\\361\\274\\252\\271\\223\\346\\276^\\350\\260q\\272m\\025.\\256\\353\\006\\005\\020\\255&\\017\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\003\\265\\376U\\001\\240P\\'X\\364\\326\\326\\275\\375s\\306\\225\\373\\264\\306H5[\\356\\b\\301>\\227\\325\\323\\315\\344\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 6\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\317\\215\\311\\246\\322\\335\\226,\\355\\243\\274E\\270\\027\\307I\\264\\344\\260\\350_\\230\\372\\034\\340\\363\\3113T\\222\\274c\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"r\\203\\252\\217hI\\312S\\323\\377](\\331C\\2711\\214T.\\031\\277\\333\\267,U|\\323x\\006\\003\\263\\233\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 7\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\277\\306\\215\\221N\\224\\b=\\v\\001\\216Ui\\033v\\250\\326\\361\\221\\332\\215\\343$\\344A\\306\\357f\\236\\330\\241\\337\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"1n@\\331(\\246#4\\262\\017\\006\\360a\\206i\\270\\211n\\344\\363\\343Y\\0000\\372,\\231\\352\\252f\\272!\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 8\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002!\\032\\210\\034\\267\\234\\t\u007F\\311T\\'(~c-dKt;\\366\\030fI5[\\026\\242\\372\\310\\342\\'\\205\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\004AX{\\301\\030\\035K\\353\\353S\\223m\\271\\352\\323\\272\\'\\202=_5\\322\\240J.\\227\\370[gZ?\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 9\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002KZ\\215?\\f\\365\\\"o\\364\\035\\n\\240\\276_\\335\\\\\\256\\277\\212J\\247\\201A\\325\\220\\361\\356\\213/!\\301\\224\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\247\\233H)F\\252\\276\\242\\370\\350\\263\\270\\b:^\\247d]\\232\\316QUA2\\n\\262\\321\u007FU\\003\\r]\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 10\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\204U\\310%\\024\\\"\\363\\267\\340\\220\\031\\341koQ\\210\\037\\022\\224Y\\354\\016\\370\\360\\374\\346\\216\\354@B\\247\\233\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"w\\265\\277h\\352\\025\\351\\274\\233\\310;rk\\264`*-H-r\\026\\326\\237%\\230\\034\\005\\236_6#a\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 11\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\213\\241A\\022c\\322\\031\\367O\\273\\375\\3354\\'Vh\\371\\362\\202\\220\\253\\366\\206:\\033\\347\\300\\227<6\\252\\034\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"R\\222\\341\\341.\\352\\306O\\340+\\276\\266#K\\211\\022\\264\\203\\225\\240\\246\\263\\023l\\327\\356 \\350\\342\\242]F\"\n"
          + "  path: 2147483692\n"
          + "  path: 2147483649\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 12\n"
          + "}";

  private static final String DETERMINISTIC_WALLET_SERIALIZATION_TXT_MASTER_KEY =
      "type: DETERMINISTIC_KEY\n"
          + "secret_bytes: \"\\354B\\331\\275;\\000\\254?\\3428\\006\\220G\\365\\243\\333s\\260s\\213R\\313\\307\\377f\\331B\\351\\327=\\001\\333\"\n"
          + "public_key: \"\\002\\357\\\\\\252\\376]\\023\\315\\'\\316`\\317\\362\\032@\\232\\\"\\360\\331\\335\\221] `\\016,\\351<\\b\\300\\225\\032m\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\370\\017\\223\\021O?.@gZ|\\233j\\3437\\317q-\\241!\u007FJ \\323\\'\\264s\\203\\314\\321\\v\\346\"\n"
          + "  path: 2147483648\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "secret_bytes: \"<M\\020I\\364\\276\\336Z\\255\\341\\330\\257\\337 \\366E_\\027\\2433w\\325\\263\\\"$\\350\\f\\244\\006\\251u\\021\"\n"
          + "public_key: \"\\002\\361V\\216\\001\\371p\\270\\212\\272\\236%\\216\\356o\\025g\\r\\035>a\\305j\\001P\\217Q\\242\\261.\\353\\367\\315\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\231B\\211S[\\216\\237\\277q{a\\365\\216\\325\\250\\223s\\v\\n(\\364\\257@3c\\312rix\\260c\\217\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  issued_subkeys: 2\n"
          + "  lookahead_size: 10\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "secret_bytes: \"\\f0\\266\\235\\272\\205\\212:\\265\\372\\214P\\226\\344\\a{S0\\354\\250\\210\\316L\\256;W\\036\\200t\\347\\343\\246\"\n"
          + "public_key: \"\\0022\\n\\252\\267NDr.7i7\\332\\232x\\367\\204G-|\\204\\301\\333G\\033g\\300O\\241\\006\\217\\366\\370\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\213\\237\\327\\245a\\273\\274\\310\\377\\360\\351\\352<\\211k\\033g\\0251>y\\236\\345Jb\\244[\\b\\fO\\0311\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  issued_subkeys: 1\n"
          + "  lookahead_size: 10\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002O_Q\\223\\337\\360\\245\\234\\322b_op\\b?\\030\\364\\255l\\206\\344`w\\274\\204\\\"\\257\\235U<}\\377\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\331\\233\\342\\227\\336r\\212>\\021\\022p\\347* +\\220\\021{\\206\\310Z\\314\\335\\322\\230\\331\\365\\221}\\321\\036\\035\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 0\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\270\\311\\006\\363\\375\\002{\\310\\254n\\301\\366\\303\\315\\255\\3462\\004/\\251\\'\\205+\\341~d\\275\\350\\\"\\313\\204\\313\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"5\\037!\\360\\335\\017\\276\\231\\273\\3531\\020\\253\\223 \\312\\240M+\\250\\2520e\\006\\034\\214{\\331\\376\\201\\004\\306\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 1\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\000\\n\\256n\\324$.\\324\\365\\231\\f\\224\\001\\376\\266\\341\\036Q\\212\\374>\\245\\324\\\\8*\\342\\370\\251x\\b-\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"5\\202n|A\\251$y+t\\005\\365\\231\\357\\323\\264E\\266l\\220\\367\\211dA\\306\\370\\247<\\'\\034\\323\\324\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 2\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\313/\\026\\020\\254\\240\\3455\\216\\342E\\300\\316\\353m.\\270\\204\\264\\327\\220H\\326E9\\310\\227 \\023~\\204\\215\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\342\\263a\\033~\\374\\234UN\\034\\302\\300\\370\\232\\347B#L\\251\\267\\035\\255\\210\\356\\vE\\264\\210\\317\\030]t\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 3\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\217\\n\\021GL\\354\\214\\354WhX\\254\\351\\337w.\\211&q1o\\003\\033\\330\\352**\\351\\356\\210\\264m\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\036\\216\\345\\320e\\267p\\241\\000\\204\\254\\370\\251d\\000\\253\\354\\316RH\\275RS\\221\\016\\343=T\\236\\335\\222P\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 4\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\325\\n\\347\\346\\3273\\312J\\211e\\335?\\227\\236\\304i\\227\\377J\\222;\\253\\017\\213\\371\\235d\\220\\231\\026aV\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"YSn>5\\364i(j\\b\\326\\212,\\f,\\322\\3200\\230\\210)\\366g\\201\\274\\232\\356\\027\\212O\\345\\215\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 5\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\264\\331\\220\\207*\\342T\\277\\323\\363\\210\\266\\335\\300\\245?\\024d\\002\\021\\263|\\253\\035\\253\\244D\\023\\004\\200\\212X\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"yP\\342|\\327\\364\\034\\f\\302}\\236\\032\\031\\t\\345h(q7\\346?wR\\221\\325\\370\\021\\225\\334\\317Bg\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 6\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002HX\\261\\035\\270!\\263\\2232-F\\334\\226n=<\\0178\\270^\\202\\225\\264PF\\v#\\bdP/\\355\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"Z#\\227\\222\\225\\303\\203\\006q\\206\\321\\v\\355\\353\\220#Oh\\360]\\001IQD\\333\\025\\356\\276\\342\\270\\021\\313\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 7\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\020C\\2310\\227\\302\\342\\274u\\217\\021h\\270\\235\\356\\326_\\365\\321\\261\\272\\340\\267\\n\\335~\\360\\343\\\"Ow\\b\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\232\\000\\3117\\235\\003`)\\021g}/\\203tk\\201\\021\\364\\247\\245;\\253\\321\\202\\207\\342\\265\\267_<\\206\\224\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 8\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\276\\211n\\305\\3339[D\\337+\\034\\263\\267U0\\263\\3039}/\\376\\207\\030\\364K\\335\\301\\245\\311\\241\\3419\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"B\\232\\f\\')\\277\\034\\316HOdn\\213\\b\\204\\361\\030\\357YS \\365zY\\2749e\\260)\\233.-\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 9\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002h\\356\\202\\222P\\204x\\345\\226\\017\\256/E\\304\\273{)\\272\\034\\375\\2451\\321\\257\\233\\372?\\320\\352\\356\\271K\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\035\\222\\325\\fY\\221(\\006\\tf#7\\370\\355el\\377\\276\\245\\354\\002\\327\\320\\247\\315V\\004\\016v\\367\\351\\225\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 10\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\325\\313@\\\"\\320\\035\\277(\\245\\222\\342{\\374g\\235\\203\\347\\217\\035\\204j\\027\\034\\244\\021bY0\\247P`\\323\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\226~!\\327\\210.\\033\\214\\251\\2367\\205<\\226`UF\\354\\234/\\365\\267E\\317\\202\\354\\211P\\244\\221\\336\\200\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 11\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\000\\334\\035\\2400n\\26636x\\316\\327\\3666\\271\\375K\\031\\366\\307\\221J@\\331@dL\\232Bv\\324\\262\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\207^n\\317\\370\\t\\207\\341*\\\\\\360\\026iBRTQ#\\252Z\\237\\373{\\315\\333\\004\\340nA9\\252\\352\"\n"
          + "  path: 2147483648\n"
          + "  path: 0\n"
          + "  path: 12\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\225b\\3515\\202\\233\\335\\320.7\\265\\274uh\\230N\\242\\254\\317\u007FJ\\364\\331\\2345\\220)\\362\\334\\216\\202\\\\\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\202:\\344\\3109?\\350\\345\\001\\314(\\244q\\370\\233Rk\\261}\\302(\\275\\326\\305R\\342:\\246\\036\\nV\\330\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 0\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003>K!8\\222VEL\\371\\305 z\\aD\u007F8\\020\\233\\330S\\251T\\330\\201V\\026-k2\\227\\266;\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\223\\265.\\200\\316\\361\\241{\\223\\342c\\212\\0213ym+\\032=#\\360\\333X\\003\\2770Z\\311\\335\\267\\342\\313\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 1\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\331t\\251d\\023\\355w\\221\\266\\301\\264\\306T\\252\\350\\200\\260A\\220\\363\\212\\345\\021\\222\\236\\003\\210\\215\\342\\r\\251\\000\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\276\\262\\033\\030\\227\\271&e\\254\\377\\346\\031\\2112\\344[\\234Z\\221-\\033\\306P,Mi\\021\\313r\\031\\317\\341\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 2\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002D\\374\\231\\027\\306\\310\\251\\261\\200\\350@\\ro\\314\\216\\037>rp\\017\\276Q\\203\\027\\016\\213\\320\\206VqO\\237\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"_K4\\n\\356\\235\\036\\243O\\261\\200\\004\\367\\324\\305;1\\247I\\350*\\353`\\204\\004d\\202\\302\\335\\200/#\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 3\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\370\\352\\3530]|\\262\\270]5\\361\\263\\255)\\027f\\342\\262\\272a-\\275\\006\\302\\266\\236\\344\\332\\364\\r\\260\\321\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"o!GH\\357\\030\\264\\003_S\\305\\204\\234wO\\344.\\215\\377\\232\\025\\206\\351\\030\\227,\\303%U2x\\225\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 4\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002\\221\\021\\370a[\\205\\267\\036\\021\\366`\\036\\371\\253Yk\\r\\303\\025\\f\\255\\2768\\310\\212\\234\\221\u007F\\333\\344\\340t\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\370~\\245F\\n\\307\\377Q:\\v\\207\\245\\336F\\376\\2443R\\034\\346\\b\u007F\\372\\b\\\\o\\303\\204D#}\\266\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 5\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002c\\034w@c\\225\\257n~G\\330\\002\\241^\\264\\231\\030\\025\\220gr\\202`u\\b\\262\\361\\312\\246\\202J\\341\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\\\\\2542\\003\\022\\254\\361*\\a/4\u007F\\307\\3430\\322\\303\\v\\205\\351\\027\\260 l\\332\\326\\235<\\363v\\020\\232\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 6\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\\266\\304\\006g\\244l\\271>\\364\\357G8B\\374\\026w\\316\\022\\205\\313\\220\\274\\273>$\\350\\212o!\\rt\\230\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"6]\\325WN\\017o\\255\\314\\213\\344\\201f\\204\\361\\235\\'\\343\\217\\341m\\327\\326=T\\2018g\\324\\261`\\335\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 7\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003X\\331\\344\\227G\\366//<V\\226\\b\\352#\\315\\307j\\263\\232\\273d\\236)\\004\\225fk\\304\\000XM\\305\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"&\\025?\\264\\a\\2334-\\203\\217\\240R\\221[{8)9\\221\\346bv=ut\\346\\226KVj\\2659\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 8\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003\u007F\\307\\273B\\334\\212\\303\\025r\\212\\264|\\250c\\204\\\\=\\360w\\335\\300\\353\\266\\273\\3209\\260nl3\\271+\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\345\\365\\034\\261\\316\\2121R\\226/+\\267K\\326C&\\236\\246],\\224\\001\\220\\347\\334\\351\\223K\\023\\252\\360\\023\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 9\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002+[\\230[E\\225\\225R2\\350X=\\366\\343\\244\\237\\260\\220J\\311\\376\\200@\\\\\\334\\312y\\212\\276\\223\\350\\267\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\250W]}O:@\\t\\016\\311\\016\\335\\016\\271\\260\\327\\261\\237\\030G\\334\\246\\233\\352t\\266\\\\S\\311\\333m*\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 10\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\003-\\221uJ\\237\\240\\320\\025\\031w\\001V\\276\\030j\\217Z\\222 \\330\\253\\332\\330F\\216\\377D\\311\\211\\277\\351\\230\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"\\241\\363\\245\\033W\\f*J\\026\\021\\210Ic\\2318a\\\"\\036\\302\\005+\\220\\003\\3364\\211o\\362\\225R~\\340\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 11\n"
          + "}\n"
          + "\n"
          + "type: DETERMINISTIC_KEY\n"
          + "public_key: \"\\002V\\3212\\255\\n\\367\\226%]0\\342\\003\\317\\031\\350\\265K\\247\\035\\005}\\004[N\\262\\262\\376Ed\\261j\\377\"\n"
          + "deterministic_key {\n"
          + "  chain_code: \"0\\236\\330H\\354\\237\\016\\367-/E\\344\\311\\024\\353\\307\\331\\367n\\017\\250n\\351\\000\\204\\233\\224\\242L\\343&;\"\n"
          + "  path: 2147483648\n"
          + "  path: 1\n"
          + "  path: 12\n"
          + "}";
}
 public static long longHash(@Nonnull final Sha256Hash hash) {
   return longHash(hash.getBytes());
 }
 public static ByteString hashToByteString(Sha256Hash hash) {
   return ByteString.copyFrom(hash.getBytes());
 }