bitcoin-s/docs/crypto/sign.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

2.6 KiB

id title
sign Sign API

The Sign API

This is the API we define to sign things with. It takes in an arbitrary byte vector and returns a Future[ECDigitalSignature]. The reason we incorporate Futures here is for extensibility of this API. We would like to provide implementations of this API for hardware devices, which need to be asynchrnous since they may require user input.

From Sign.scala:

import scodec.bits._
import org.bitcoins.crypto._
import scala.concurrent._
import scala.concurrent.duration._

trait Sign {
  def signFunction: ByteVector => Future[ECDigitalSignature]

  def signFuture(bytes: ByteVector): Future[ECDigitalSignature] =
    signFunction(bytes)

  def sign(bytes: ByteVector): ECDigitalSignature = {
    Await.result(signFuture(bytes), 30.seconds)
  }

  def publicKey: ECPublicKey
}

The ByteVector that is input to the signFunction should be the hash that is output from TransactionSignatureSerializer's hashForSignature method. Our in-memory ECKey types implement the Sign API.

If you wanted to implement a new Sign api for a hardware wallet, you can easily pass it into the TxBuilder/Signer classes to allow for you to use those devices to sign with Bitcoin-S.

This API is currently used to sign ordinary transactions with our Signers. The Signer subtypes (i.e. P2PKHSigner) implement the specific functionality needed to produce a valid digital signature for their corresponding script type.

The ExtSign API.

An ExtKey is a data structure that can be used to generate more keys from a parent key. For more information look at hd-keys.md

You can sign with ExtPrivateKey the same way you could with a normal ECPrivateKey.

import org.bitcoins.core.hd._
import org.bitcoins.core.crypto._

val extPrivKey = ExtPrivateKey(ExtKeyVersion.SegWitMainNetPriv)

extPrivKey.sign(DoubleSha256Digest.empty.bytes)

val path = BIP32Path(Vector(BIP32Node(0,false)))

extPrivKey.sign(DoubleSha256Digest.empty.bytes,path)

With ExtSign, you can use ExtPrivateKey to sign transactions inside of TxBuilder since UTXOSpendingInfo takes in Sign as a parameter.

You can also provide a path to use to derive a child ExtPrivateKey, and then sign with that child private key