mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2024-11-20 02:11:40 +01:00
a503441619
* 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
61 lines
2.6 KiB
Markdown
61 lines
2.6 KiB
Markdown
---
|
|
id: sign
|
|
title: Sign API
|
|
---
|
|
|
|
### The [`Sign` API](org/bitcoins/core/crypto/Sign.scala)
|
|
|
|
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 `Future`s 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](../../core/src/main/scala/org/bitcoins/core/crypto/Sign.scala):
|
|
|
|
```scala mdoc
|
|
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`](/api/org/bitcoins/core/crypto/TransactionSignatureSerializer)'s `hashForSignature` method. Our in-memory [`ECKey`](/api/org/bitcoins/core/crypto/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 [`Signer`](/api/org/bitcoins/core/wallet/signer/Signer)s. The `Signer` subtypes (i.e. `P2PKHSigner`) implement the specific functionality needed to produce a valid digital signature for their corresponding script type.
|
|
|
|
|
|
### The [`ExtSign`](../../core/src/main/scala/org/bitcoins/core/crypto/Sign.scala) API.
|
|
|
|
An [ExtKey](org/bitcoins/core/crypto/ExtKey.scala) is a data structure that can be used to generate more keys from a parent key. For more information look at [hd-keys.md](../core/hd-keys.md)
|
|
|
|
You can sign with `ExtPrivateKey` the same way you could with a normal `ECPrivateKey`.
|
|
|
|
```scala mdoc:to-string
|
|
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 |