mirror of
https://github.com/luxfi/go-bip32.git
synced 2026-07-27 01:14:41 +00:00
67 lines
2.9 KiB
Markdown
67 lines
2.9 KiB
Markdown
# go-bip32
|
|||
|
|
|
||
|
|
[](https://travis-ci.org/tyler-smith/go-bip32)
|
||
|
|
|
||
|
|
An implementation of the BIP32 spec for Hierarchical Deterministic Bitcoin addresses as a simple Go library. The semantics of derived keys are up to the user. [BIP43](https://github.com/bitcoin/bips/blob/master/bip-0043.mediawiki) and [BIP44](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) are good schemes to implement with this library. An additional library for either or both of those on top of this library should be developed.
|
||
|
|
|
||
|
|
## Example
|
||
|
|
|
||
|
|
It's very unlikely, but possible, that a given index does not produce a valid
|
||
|
|
private key. Error checking is skipped in this example for brevity but should be handled in real code. In such a case, a ErrInvalidPrivateKey is returned.
|
||
|
|
|
||
|
|
ErrInvalidPrivateKey should be handled by trying the next index for a child key.
|
||
|
|
|
||
|
|
Any valid private key will have a valid public key so that `Key.PublicKey()`
|
||
|
|
method never returns an error.
|
||
|
|
|
||
|
|
```go
|
||
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/tyler-smith/go-bip32"
|
||
|
|
"fmt"
|
||
|
|
"log"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Example address creation for a fictitious company ComputerVoice Inc. where
|
||
|
|
// each department has their own wallet to manage
|
||
|
|
func main(){
|
||
|
|
// Generate a seed to determine all keys from.
|
||
|
|
// This should be persisted, backed up, and secured
|
||
|
|
seed, err := bip32.NewSeed()
|
||
|
|
if err != nil {
|
||
|
|
log.Fatalln("Error generating seed:", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Create master private key from seed
|
||
|
|
computerVoiceMasterKey, _ := bip32.NewMasterKey(seed)
|
||
|
|
|
||
|
|
// Map departments to keys
|
||
|
|
// There is a very small chance a given child index is invalid
|
||
|
|
// If so your real program should handle this by skipping the index
|
||
|
|
departmentKeys := map[string]*bip32.Key{}
|
||
|
|
departmentKeys["Sales"], _ = computerVoiceMasterKey.NewChildKey(0)
|
||
|
|
departmentKeys["Marketing"], _ = computerVoiceMasterKey.NewChildKey(1)
|
||
|
|
departmentKeys["Engineering"], _ = computerVoiceMasterKey.NewChildKey(2)
|
||
|
|
departmentKeys["Customer Support"], _ = computerVoiceMasterKey.NewChildKey(3)
|
||
|
|
|
||
|
|
// Create public keys for record keeping, auditors, payroll, etc
|
||
|
|
departmentAuditKeys := map[string]*bip32.Key{}
|
||
|
|
departmentAuditKeys["Sales"] = departmentKeys["Sales"].PublicKey()
|
||
|
|
departmentAuditKeys["Marketing"] = departmentKeys["Marketing"].PublicKey()
|
||
|
|
departmentAuditKeys["Engineering"] = departmentKeys["Engineering"].PublicKey()
|
||
|
|
departmentAuditKeys["Customer Support"] = departmentKeys["Customer Support"].PublicKey()
|
||
|
|
|
||
|
|
// Print public keys
|
||
|
|
for department, pubKey := range departmentAuditKeys {
|
||
|
|
fmt.Println(department, pubKey)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Thanks
|
||
|
|
|
||
|
|
The developers at [Factom](https://www.factom.com/) have contributed a lot to this library and have made many great improvements to it. Please check out their project(s) and give them a thanks if you use this library.
|
||
|
|
|
||
|
|
Thanks to [bartekn](https://github.com/bartekn) from Stellar for some important bug catches.
|