Edited at

electrumxに問い合わせるときに使うscripthashスニペット

新しいプロトコルバージョンではアドレスではなく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から現れた

https://electrumx.readthedocs.io/en/latest/protocol-changes.html#version-1-1


プロトコルバージョン1.2からアドレスを引数にした処理が非推奨

https://electrumx.readthedocs.io/en/latest/protocol-changes.html#version-1-2


プロトコルバージョン1.3からアドレスを引数にした処理が削除されscripthashが必須

https://electrumx.readthedocs.io/en/latest/protocol-changes.html#version-1-3