しゅーと (@shutingrz)
しゅーと (@shutingrz)
Security researcher
Apr 28, 2019 5 min read

自作仮想通貨入門(3) - Litecoinを試してみよう

自作仮想通貨を作る前に、もととなるLitecoinでマイニングや送金を試してみます。
既にコマンドラインでマイニングや送金を行ったことがあるかたは、読み飛ばしてもかまいません。

なお、前の項目でLitecoinをコンパイルしましたが、Litecoinはテスト用に起動するだけなので、
システムへのインストール(make install)は行いません。

注意事項

このページにはアドレス・トランザクション・ブロックの様々な値が記載されています。 これらの値はランダムに生成されるものなので、例と別の値が出てきても慌てず、うまく読み替えてください。

litecoindの起動

以下のコマンドを入力し、regtestモードでLitecoinを起動します。

$ src/litecoind -regtest -daemon

ここからlitecoin-cliを使ってlitecoindを操作していきます。

残高の確認

getbalanceサブコマンドを使うことで、ウォレットの残高を確認できます。

$ src/litecoin-cli -regtest getbalance
0.00000000

何もしていないので当然0です。

ブロックチェーンの確認

初期状態のブロックチェーンを確認してみましょう。

 $ src/litecoin-cli -regtest getblockchaininfo
{
  "chain": "regtest",
  "blocks": 0,
  "headers": 0,
  "bestblockhash": "530827f38f93b43ed12af0b3ad25a288dc02ed74d6d7857862df51fc56c416f9",
  "difficulty": 4.656542373906925e-10,
  "mediantime": 1296688602,
  "verificationprogress": 1,
  "initialblockdownload": true,
  "chainwork": "0000000000000000000000000000000000000000000000000000000000000002",
  "size_on_disk": 288,
(snip)

blocksが0となっている通り、ジェネシスブロックだけが存在する状態です。

1回だけマイニングしてみる

$ src/litecoin-cli -regtest generate 1
[
  "893d4887d2f1b2dd57783b82f0e57b33f4ff2c9d49d0039a2245438fa116ee51"
]

1回のマイニングで報酬の50コインがもらえるか、実際に確かめてみましょう。

$ src/litecoin-cli -regtest getbalance
0.00000000

増えていません。
なぜならマイニング報酬は後ろに100ブロックチェーンが続かないと使えないようになっているからです。

100回マイニングしてみる

$ src/litecoin-cli -regtest generate 100
[
  "126bb2b2dfb352831ba4ec6845ed2b3b24bedd51b816c8ee13676a65c3c25031",
  "3b65d2972b766a24df55ccfec5a22b3170bfb08724af07c22999ae3748dc51c7",
(略)

ここでブロックチェーンの長さを確認します。

$ src/litecoin-cli -regtest getblockchaininfo

  "headers": 101,
  "bestblockhash": "6c1f80ff50dad8342698831e0d3ccb22f2e746801f399b40a1d99a4004c719e7",
  "difficulty": 4.656542373906925e-10,
(略)

長さは101になっていますね。
残高を確認してみましょう。

$ src/litecoin-cli -regtest getbalance
50.00000000

おめでとうございます!無事に残高が50コインになっています。 2018/08/19現在、1ビットコインは日本円で約70万円なので、もしこれがビットコインだったなら3500万円を手に入れたことになります。

送金してみる

受け取り先アドレスの作成

「tanaka」という名称を付けてアドレスを作成します。

$ src/litecoin-cli -regtest getnewaddress tanaka
QjokZsocrpSUK1rfwaok6rnN6kvTN2eksc

tanakaというアカウントで、アドレス「QjokZsocrpSUK1rfwaok6rnN6kvTN2eksc」が作成されました。 この時点でのアカウントごとの残高を確認します。

$ src/litecoin-cli -regtest listaccounts
{
  "": 50.00000000,
  "tanaka": 0.00000000
}

既存のデフォルトアカウントに50コイン、takanaアカウントに0コインの残高があることがわかります。

tanakaに送金してみる

デフォルトアカウントからtanakaに20コイン送金してみます。

$ src/litecoin-cli -regtest sendtoaddress QjokZsocrpSUK1rfwaok6rnN6kvTN2eksc 20
c80b9c9de0bb4a85a02bf95ecf8d71189c9d38e5b473a21067302d67e131e590

トランザクション「c80b9c・・・」が作成されました。

この状態で改めて残高を確認します。

$ src/litecoin-cli -regtest listaccounts
{
  "": 29.99624000,
  "tanaka": 0.00000000
}

デフォルトアカウントの残高が減って、tanakaは何も増えていません。
また、ウォレットが使える取引情報(UTXO)を確認してみます。

$ src/litecoin-cli -regtest listunspent
[
]

何もありません。
これはトランザクションが発行されただけで、ブロックに記録されていないからです。
未確定のトランザクションを確認するためには、 listunspent 0 を指定します。

 $ src/litecoin-cli -regtest listunspent 0
[
  {
    "txid": "c80b9c9de0bb4a85a02bf95ecf8d71189c9d38e5b473a21067302d67e131e590",
    "vout": 0,
    "address": "QjokZsocrpSUK1rfwaok6rnN6kvTN2eksc",
    "account": "tanaka",
    "redeemScript": "0014050bc9402e7b0ab96c52dc9d585e21b3c54fb2db",
    "scriptPubKey": "a914fe84949a0a2e0d7a113be0a3e6477181eee7f56c87",
    "amount": 20.00000000,
    "confirmations": 0,
    "spendable": true,
    "solvable": true,
    "safe": true
  },
  {
    "txid": "c80b9c9de0bb4a85a02bf95ecf8d71189c9d38e5b473a21067302d67e131e590",
    "vout": 1,
    "address": "QNa7cd7mmjsxt5ndqwVskRPzDVKMRyiBPa",
    "redeemScript": "0014654c30cd52f71d9d6ac0211983a2286be25c5a06",
    "scriptPubKey": "a9141595af5c3857e5b202227c74f61bf0a98f0f893b87",
    "amount": 29.99624000,
    "confirmations": 0,
    "spendable": true,
    "solvable": true,
    "safe": true
  }
]

未確定のトランザクションには確かに送金情報が記載されています。

マイニングを行いトランザクションを確定させる

マイニングを行い、tanakaへ送金したトランザクションをブロックに記録させます。

$ src/litecoin-cli -regtest generate 1
[
  "05434d002c7ae729fa2e581997686c590a5f9fed2a374371f195c6654b833d3b"
]

ここで改めて残高とUTXOを確認します。

  • 残高の確認
$ src/litecoin-cli -regtest listaccounts
{
  "": 79.99624000,
  "tanaka": 20.00000000
}

デフォルトアカウントに2ブロック目のマイニングで得た報酬の50コインが、tanakaには先ほどの送金分である20コインが足されています。

  • UTXO の確認
$ src/litecoin-cli -regtest listunspent
[
  {
    "txid": "c80b9c9de0bb4a85a02bf95ecf8d71189c9d38e5b473a21067302d67e131e590",
    "vout": 0,
    "address": "QjokZsocrpSUK1rfwaok6rnN6kvTN2eksc",
    "account": "tanaka",
    "redeemScript": "0014050bc9402e7b0ab96c52dc9d585e21b3c54fb2db",
    "scriptPubKey": "a914fe84949a0a2e0d7a113be0a3e6477181eee7f56c87",
    "amount": 20.00000000,
    "confirmations": 1,
    "spendable": true,
    "solvable": true,
    "safe": true
  },
  {
    "txid": "c80b9c9de0bb4a85a02bf95ecf8d71189c9d38e5b473a21067302d67e131e590",
    "vout": 1,
    "address": "QNa7cd7mmjsxt5ndqwVskRPzDVKMRyiBPa",
    "redeemScript": "0014654c30cd52f71d9d6ac0211983a2286be25c5a06",
    "scriptPubKey": "a9141595af5c3857e5b202227c74f61bf0a98f0f893b87",
    "amount": 29.99624000,
    "confirmations": 1,
    "spendable": true,
    "solvable": true,
    "safe": true
  },
  {
    "txid": "960cd64e6bb01aa669540a58dabe17e2db631e428fdb9c0f63066975b658fca8",
    "vout": 0,
    "address": "mvWofpVPymfSrHuBEegAMz6QJt2X4Lzqtk",
    "scriptPubKey": "2103a82d430bfe97d5d0755ab93c93b6c628c9342ccd4ae250311061e0467793753eac",
    "amount": 50.00000000,
    "confirmations": 101,
    "spendable": true,
    "solvable": true,
    "safe": true
  }
]

UTXOには以下の情報が含まれています。

  • デフォルトアカウントからtanakaに送金した20コイン
  • おつりの29.99624000コイン
  • マイニング報酬の50コイン

なお送金を行ったトランザクションのインプットで50コイン分のUTXOを使用していますが、使用したのは49.99624コインです。
残っている0.00376コインは暗黙的に手数料を示していて、マイナーが作成したCoinBaseトランザクションに合算されます。

ここで一応ブロックを見てみましょう。
先ほどのgenerateの返り値のブロックハッシュを指定します。

$ src/litecoin-cli -regtest getblock 05434d002c7ae729fa2e581997686c590a5f9fed2a374371f195c6654b833d3b
{
  "hash": "05434d002c7ae729fa2e581997686c590a5f9fed2a374371f195c6654b833d3b",
  "confirmations": 1,
  "strippedsize": 415,
  "size": 451,
  "weight": 1696,
  "height": 102,
  "version": 536870912,
  "versionHex": "20000000",
  "merkleroot": "8a3f6d02fe2cb106c6bd1b47ac09dbb1ef7f68675003f1c3ec24a09ec0f6d9ed",
  "tx": [
    "3a9b412663b6d5d373e0939b0f93cfce070383630a522fa6c9abd44faf64260c",
    "c80b9c9de0bb4a85a02bf95ecf8d71189c9d38e5b473a21067302d67e131e590"
  ],
  "time": 1531800402,
  "mediantime": 1531799237,
  "nonce": 4,
  "bits": "207fffff",
  "difficulty": 4.656542373906925e-10,
  "chainwork": "00000000000000000000000000000000000000000000000000000000000000ce",
  "previousblockhash": "6c1f80ff50dad8342698831e0d3ccb22f2e746801f399b40a1d99a4004c719e7"
}

txパラメータに、tanakaへの送金トランザクション「c80b9c・・・」と、マイニング報酬を示すCoinBaseのトランザクション「3a9b41・・・」が含まれています。

最後に CoinBaseトランザクションを見てみましょう。

$ src/litecoin-cli -regtest gettransaction 3a9b412663b6d5d373e0939b0f93cfce070383630a522fa6c9abd44faf64260c
{
  "amount": 0.00000000,
  "confirmations": 1,
  "generated": true,
  "blockhash": "05434d002c7ae729fa2e581997686c590a5f9fed2a374371f195c6654b833d3b",
  "blockindex": 0,
  "blocktime": 1531800402,
  "txid": "3a9b412663b6d5d373e0939b0f93cfce070383630a522fa6c9abd44faf64260c",
  "walletconflicts": [
  ],
  "time": 1531800402,
  "timereceived": 1531800402,
  "bip125-replaceable": "no",
  "details": [
    {
      "account": "",
      "address": "muPHrdiXX1ADd59vvv197dNjbPuSWuUEJM",
      "category": "immature",
      "amount": 50.00376000,
      "vout": 0
    }
  ],
  "hex": "020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401660101ffffffff02c0ae0b2a01000000232103c0de37a55878410a47d700880c37a67265a397d5f2c8e7e99d05a238b86a1d8eac0000000000000000266a24aa21a9ed5894f0f80c141be223bd7c9560f649036d6d77f3f72ae5249562322252fdb1c20120000000000000000000000000000000000000000000000000000000000000000000000000"
}

amount に、マイニング報酬の50コインと手数料の0.00376コインを含めた50.00376が記載されています。

チュートリアルは以上です。最後にlitecoindを終了させておきましょう。

$ src/litecoin-cli -regtest stop