LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-13

新しいプロトコルバージョンではアドレスではなく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が必須

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1