mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-02-24 15:02:17 +01:00
* Make imports in chain.md invisible * Hide imports in wallet.md * Make all core module md files imports hidden * Cleanup imports on rpc markdown docs * Try and figure weird travis behavior * Get rid of uneeded nest qualifiers on mdoc
63 lines
1.8 KiB
Markdown
63 lines
1.8 KiB
Markdown
---
|
|
id: addresses
|
|
title: Generating addresses
|
|
---
|
|
|
|
Almost all Bitcoin applications need to generate addresses
|
|
for their users somehow. There's a lot going on in getting
|
|
a correct bitcoin address, but our APIs make it possible to
|
|
to get started with all types of addresses in a matter of
|
|
minutes.
|
|
|
|
## Generating SegWit (bech32) addresses
|
|
|
|
Generating native SegWit addresses in the bech32 format
|
|
is something that all Bitcoin applications should enable,
|
|
as it makes the transaction fees less expensive, and also
|
|
makes the addresses more readable by humans. However, it
|
|
has seen slower than necessary adoption. With Bitcoin-S
|
|
you can generate bech32 addresses in four(!) lines of code
|
|
(not counting comments and imports), so now there's no
|
|
reason to keep using legacy transaction formats.
|
|
|
|
```scala mdoc:invisible
|
|
import org.bitcoins.core.{crypto, protocol, config}
|
|
import config.TestNet3
|
|
import crypto.ECPrivateKey
|
|
|
|
import protocol._
|
|
import protocol.script._
|
|
import org.bitcoins.core.protocol.P2PKHAddress
|
|
```
|
|
|
|
```scala mdoc:to-string
|
|
|
|
// this generates a random private key
|
|
val privkey = ECPrivateKey()
|
|
val pubkey = privkey.publicKey
|
|
|
|
val segwitAddress = {
|
|
// see https://bitcoin.org/en/glossary/pubkey-script
|
|
// for reading resources on the details of scriptPubKeys
|
|
// pay-to-witness-pubkey-hash scriptPubKey V0
|
|
val scriptPubKey = P2WPKHWitnessSPKV0(pubkey)
|
|
Bech32Address(scriptPubKey, TestNet3)
|
|
}
|
|
|
|
println(segwitAddress.toString)
|
|
```
|
|
|
|
## Generating legacy (base58) addresses
|
|
|
|
If you need to generate legacy addresses for backwards
|
|
compatability reasons, that's also a walk in the park.
|
|
Take a look:
|
|
|
|
```scala mdoc:to-string
|
|
|
|
// we're reusing the same private/public key pair
|
|
// from before. don't do this in an actual application!
|
|
val legacyAddress = P2PKHAddress(pubkey, TestNet3)
|
|
|
|
println(legacyAddress.toString)
|
|
```
|