// String returns the extended key as a human-readable base58-encoded string. func (k *ExtendedKey) String() string { var childNumBytes [4]byte depthByte := byte(k.depth % 256) binary.BigEndian.PutUint32(childNumBytes[:], k.childNum) // The serialized format is: // version (4) || depth (1) || parent fingerprint (4)) || // child num (4) || chain code (32) || key data (33) || checksum (4) serializedBytes := make([]byte, 0, serializedKeyLen+4) serializedBytes = append(serializedBytes, k.version...) serializedBytes = append(serializedBytes, depthByte) serializedBytes = append(serializedBytes, k.parentFP...) serializedBytes = append(serializedBytes, childNumBytes[:]...) serializedBytes = append(serializedBytes, k.chainCode...) if k.isPrivate { serializedBytes = append(serializedBytes, 0x00) serializedBytes = append(serializedBytes, k.key...) } else { serializedBytes = append(serializedBytes, k.pubKeyBytes()...) } checkSum := btcwire.DoubleSha256(serializedBytes)[:4] serializedBytes = append(serializedBytes, checkSum...) return btcutil.Base58Encode(serializedBytes) }
func TestBase58(t *testing.T) { // Base58Encode tests for x, test := range stringTests { tmp := []byte(test.in) if res := btcutil.Base58Encode(tmp); res != test.out { t.Errorf("Base58Encode test #%d failed: got: %s want: %s", x, res, test.out) continue } } // Base58Decode tests for x, test := range hexTests { b, err := hex.DecodeString(test.in) if err != nil { t.Errorf("hex.DecodeString failed failed #%d: got: %s", x, test.in) continue } if res := btcutil.Base58Decode(test.out); bytes.Equal(res, b) != true { t.Errorf("Base58Decode test #%d failed: got: %q want: %q", x, res, test.in) continue } } // Base58Decode with invalid input for x, test := range invalidStringTests { if res := btcutil.Base58Decode(test.in); string(res) != test.out { t.Errorf("Base58Decode invalidString test #%d failed: got: %q want: %q", x, res, test.out) continue } } }