Seperti yang kita ketahui bahwa Bitcoin Core Client tidak bisa melakukan Sign Message menggunakan Segwit Address. Namun ada sebuah opsi untuk tetap bisa melakukan Sign Message (segwit address) di Bitcoin core dengan cara menggunakan RPC Command di Console dengan argumen
signmessagewithprivkey "privkey" "message"Syaratnya harus mengetahui Private Key dari Segwit Address tersebut. Untuk legacy wallet bisa menggunakan bantuan
dumpprivkey, sementara untuk Descriptor Wallet bisa menggunakan
cara ini. Namun untuk proses verifikasi tidak bisa dilakukan di Bitcoin Core karena belum support (Address does not refer to key (code -3)) dan harus dilakukan menggunakan wallet lain atau situs-situs yang bisa melakukan verifikasi sign message.
Bitcoin Core (Sign Message dengan Private Key (Segwit Address))
Contoh :
Segwit Address: bc1qwmzg48dx0puruhcd5mmvt4370e4ed27a60d6gf
Private Key: Kzpgr---------------------------------------------------------RU4vg
Message: Test Sign Message using a Private Key associated with a Segwit address
RPC Command di Console :
signmessagewithprivkey "Kzpgr---------------------------------------------------------RU4vg" "Test Sign Message using a Private Key associated with a Segwit address"
Signature :
H1KXEgu/KX/tPLYdTMa9mv91tX3zX3993ouGds3RCYclCS02KM0IGh4VbzxZFbToWiKst6S4+CV/oJ80f2yqzp4=
Akan saya coba bandingkan hasilnya dengan Signature yang dibuat dari Sign Message menggunakan Wallet Electrum dan Node.JS. Apakah ketiganya akan menghasilkan Signature yang sama ?
ElectrumSegwit Address: bc1qwmzg48dx0puruhcd5mmvt4370e4ed27a60d6gf
Message: Test Sign Message using a Private Key associated with a Segwit address
Signature :
H1KXEgu/KX/tPLYdTMa9mv91tX3zX3993ouGds3RCYclCS02KM0IGh4VbzxZFbToWiKst6S4+CV/oJ80f2yqzp4=
Node.JSconst bitcoin = require('bitcoinjs-lib');
const bitcoinMessage = require('bitcoinjs-message');
const ECPairFactory = require('ecpair');
const ecc = require('tiny-secp256k1');
const ECPair = ECPairFactory.ECPairFactory(ecc);
const keyPair = ECPair.fromWIF('Kzpgr---------------------------------------------------------RU4vg');
const privateKey = keyPair.privateKey;
const message = 'Test Sign Message using a Private Key associated with a Segwit address';
const signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed);
console.log(signature.toString('base64'));
Signature :
H1KXEgu/KX/tPLYdTMa9mv91tX3zX3993ouGds3RCYclCS02KM0IGh4VbzxZFbToWiKst6S4+CV/oJ80f2yqzp4=
Ternyata ketiganya memiliki Signature yang identik, dan jika di representasikan ke Format RFC2440, adalah sebagai berikut :
-----BEGIN BITCOIN SIGNED MESSAGE-----
Test Sign Message using a Private Key associated with a Segwit address
-----BEGIN SIGNATURE-----
bc1qwmzg48dx0puruhcd5mmvt4370e4ed27a60d6gf
H1KXEgu/KX/tPLYdTMa9mv91tX3zX3993ouGds3RCYclCS02KM0IGh4VbzxZFbToWiKst6S4+CV/oJ80f2yqzp4=
-----END BITCOIN SIGNED MESSAGE-----
Untuk verifikasi bisa dilakukan di :
- Wallet Electrum
-
https://www.verifybitcoinmessage.com/-
https://btc.bitaps.com/signature