bitcoin-s/docs/core/addresses.md
Nadav Kohen a503441619 Crypto Project Refactor (#1380)
* Added crypto project and decoupled BitcoinSLogger from NetworkElement

Decoupled BitcoinSLogger from Factory

Moved NetworkElement into crypto project

Moved Factory and BitcoinSUtil (renamed to BytesUtil) to crypto project

Moved MaskedToString to crypto project

Added BytesUtil to imports and cleaned up CryptoUtil.recoverPoint

Moved the rest of crypto stuff to the crypto project

Moved crypto tests to crypto-test project

* Added documentation for crypto project
2020-04-30 12:34:53 -05:00

1.8 KiB

id title
addresses 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.

import org.bitcoins.core.{protocol, config}
import config.TestNet3
import org.bitcoins.crypto.ECPrivateKey

import protocol._
import protocol.script._
import org.bitcoins.core.protocol.P2PKHAddress

// 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:


// 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)