SLP(Simple Ledger Protocol)トークンをNode.jsから手動で焼いてみる

f:id:serinuntius:20190312115117p:plain

はじめに

念の為書いておきますが、こちらの方法でトークンを作るのに失敗したりしても、自己責任でお願いします。 テストネットで十分検証した上で、メインネットでやりましょう。

準備

mkdir slp_test
cd slp_test
npm init
npm install slp-sdk --save

NodeのREPLでmnemonicを生成します。

$ node
const BITBOXSDK = require('bitbox-sdk')
const BITBOX = new BITBOXSDK()
BITBOX.Mnemonic.generate(128)

'absurd unfair anchor loyal drill twin letter banana bright approve tone cube'

この12個の単語は秘密鍵みたいなものなので、絶対に他人に漏らしてはいけません。 GitHubにもコミットすべきではないでしょう。

アドレスを生成して、送金しておく

const BITBOXSDK = require('bitbox-sdk')
const SLPSDK = require('slp-sdk')
const SLP = new SLPSDK()
const BITBOX = new BITBOXSDK()

const mnemonic = 'absurd unfair anchor loyal drill twin letter banana bright approve tone cube'

let seedBuffer = BITBOX.Mnemonic.toSeed(mnemonic)


// 今回はtestnet用のアドレスを生成します。
// メインネットなら BITBOX.HDNode.fromSeed(seedBuffer)
let hdNode = BITBOX.HDNode.fromSeed(seedBuffer, 'testnet')

const wif = BITBOX.HDNode.toWIF(hdNode)


const address = BITBOX.HDNode.toCashAddress(hdNode)
console.log(address)
node index.js
bchtest:qzghg4u00s4n2yf3emlcqaxp64n0de2mas7fg4v4qw

bitcoin.com さんに感謝しつつ、テストネット用のBCHを

Testnet BCH Faucet - Bitcoin.com Developer Platform

からいただきます。

実際に作ってみる

const BITBOXSDK = require('bitbox-sdk')
const SLPSDK = require('slp-sdk')
const SLP = new SLPSDK()
const BITBOX = new BITBOXSDK()

const mnemonic = 'absurd unfair anchor loyal drill twin letter banana bright approve tone cube'

let seedBuffer = BITBOX.Mnemonic.toSeed(mnemonic)

let hdNode = BITBOX.HDNode.fromSeed(seedBuffer, 'testnet')

const wif = BITBOX.HDNode.toWIF(hdNode)


const address = BITBOX.HDNode.toCashAddress(hdNode)
console.log(address)

const slp_address = SLP.Address.toSLPAddress(address)
console.log(slp_address)

SLP.TokenType1.create({
    fundingAddress: address, // 手数料を払うアドレス
    fundingWif: wif, // 手数料を払うWif(Wallet import format) 秘密鍵みたいなものかな?
    tokenReceiverAddress: slp_address, // 作ったtokenを受け取るアドレス
    batonReceiverAddress: slp_address, // (たぶん)あとでもっとトークンを増やしたい(mint)ってときに追加で焼く権利を持っているアドレス
    bchChangeReceiverAddress: slp_address, // お釣りを受け取るアドレス
    decimals: 4,  // 小数点以下が何桁か
    name: 'Shit Coin', // 名前
    symbol: 'shit', // 単位
    documentUri: 'http://shit.org', // トークンのドキュメントのURL
    documentHash: null, // トークンのドキュメントのhash
    initialTokenQty: 100000000000, // 最初に発行するトークンの量
}).then(tokenID => console.log).catch(err => console.log)
node index.js
bchtest:qzghg4u00s4n2yf3emlcqaxp64n0de2mas7fg4v4qw
slptest:qzghg4u00s4n2yf3emlcqaxp64n0de2mas9a0wkzjn
03c8dfe1f8f00270ac01bc3194bb9dbe84efc3d391f13aec22ea419bcb33d29a

最後に出力される 03c8dfe1f8f00270ac01bc3194bb9dbe84efc3d391f13aec22ea419bcb33d29a がtoken idと呼ばれ、このトークンのgenesisトランザクションとなります。 このtoken idがトークンをユニークであると証明するためのidであり、追加で発行する(mint)する際にも必要になるようです。*1

bitcoin.comさんに感謝しつつ、テストネットのエクスクプローラーでtoken idを入力してみましょう。

Bitcoin Cash TESTNET (tBCH) Block Explorer

f:id:serinuntius:20190312113300p:plain

こちらのようにOP_RETURNに刻まれていれば成功です。

f:id:serinuntius:20190312113554p:plain

おわりに

結構簡単にトークンの発行ができたと思います。

次回はメインネットで発行して、誰かに送信するのをやってみたいと思います。

参考

SLP: Getting Started - Bitcoin.com Developer Platform

*1:実際はただのtx id何ですけどねw