新しいプロトコルバージョンではアドレスではなくscripthashを使って問い合わせる必要がある
p2pkhのscripthashはscriptpubkeyから作る
p2shのscripthashはredeem scriptから作る
scripthash(p2pkh ver)とは
- アドレスを作るための元となるデータscriptpubkey(ビットコインにはアドレスと言う概念はそもそもない、ウォレット上の概念)をsha256でハッシュしたもの
- scriptpubkey = pubkey + bitcoin script
- scripthash = sha256(scriptpubkey).reverse()
- コインごとに別の値にならない
scriptpubkeyからscripthashを生成するやりかた
- sha256でハッシュしてから反転したものをscripthashとする
const crypto = require("crypto")
const toScriptHash = (scriptpubkey) => {
const sha256 = crypto.createHash("sha256")
const buf = Buffer.from(scriptpubkey, "hex")
const data = sha256.update(buf).digest()
return data.reverse().toString("hex")
}
if(toScriptHash("76a91436896b2798eeec0fc03c95b52a357448ed0dfd4688ac") === "719bcde52a3ef42b6f665d338eaed567ac66426dd3127595584abbd8e255dd58"){
console.log("OK")
}
scriptpubkey取得のサンプル(xpubから)
const bitcoin = require("bitcoinjs-lib")
const bip32 = require("bip32")
const getScriptPubkey = (node, network)=> {
return bitcoin.payments.p2pkh({ pubkey: node.publicKey, network }).output
}
const xpub = "xpubxxxxxxxxxxxxx"
const hdnode = bip32.fromBase58(xpub, bitcoin.networks["bitcoin"])
const node = hdnode.derivePath("1/1")
const scriptpubkey = getScriptPubkey(node)
console.log(scriptpubkey.toString("hex"))
scriptpubkey取得のサンプル(アドレスから)
const bitcoin = require("bitcoinjs-lib")
const address = "1xxxxxxxxxxxxxx"
const scriptpubkey = bitcoin.address.toOutputScript(address)
console.log(scriptpubkey.toString("hex"))
scripthashを扱えるプロトコルバージョン
- electrumx 1.3からプロトコルバージョン1.2対応
- electrumx 1.5からプロトコルバージョン1.3対応
- electrumx 1.8 プロトコルバージョン1.1 - 1.4
プロトコルバージョン1.1から現れた
プロトコルバージョン1.2からアドレスを引数にした処理が非推奨
プロトコルバージョン1.3からアドレスを引数にした処理が削除されscripthashが必須