Sign API
Sign
API
The 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 asynchronous 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 BaseECKey
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
s. The Signer
subtypes (i.e. P2PKHSigner
) implement the specific functionality needed to produce a valid digital signature for their corresponding script type.
ExtSign
API.
The 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: ExtPrivateKey = Masked(ExtPrivateKeyImpl)
extPrivKey.sign(DoubleSha256Digest.empty.bytes)
// res0: ECDigitalSignature = ECDigitalSignature(3045022100cf76a6fa05f82891030a92551fab319e8aac16fa7a65ba70a59ccc640d36ef1f022021efeb587fa94eb780427c39bd494daebb1654967a369980ed10f6eb7d6bd0a9)
val path = BIP32Path(Vector(BIP32Node(0,HardenedType.defaultOpt)))
// path: BIP32Path = m/0'
extPrivKey.sign(DoubleSha256Digest.empty.bytes,path)
// res1: ECDigitalSignature = ECDigitalSignature(304402201163bb5324966967d6529ce57334e2393b30d344b360f2fc3a201f1683374005022054f6b0c73080a2e1f7bb6151b26a11449c7c4f1ecb7dfda06dcdcbdec9a81cf1)
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