はじめに
こんにちは。
今回は 自作仮想通貨「RinCoin」 を実際に設計・実装・運用している話を書きます。
いわゆる
- ERC20トークン
- テストネット用の学習コイン
ではなく、
- 独自ブロックチェーン
- 独自PoWアルゴリズム(RinHash)
- CPU / GPUマイニング対応
- 実運用ネットワークあり
という、かなり「フルスクラッチ寄り」な仮想通貨です。
RinCoinとは?
RinCoin は以下の特徴を持つ仮想通貨です。
- Proof of Work(PoW)
- Bitcoin / Litecoin 系コードベース
- ASIC耐性を意識した独自ハッシュアルゴリズム
- GPU / CPU マイニングを前提
- 個人開発・コミュニティ主導
なぜ作ったのか?
理由はシンプルで、
- 既存PoWアルゴリズムは ASIC に支配されがち
- GPU/CPUマイニングが形骸化している
- アルゴリズムを自分で設計してみたかった
という動機です。
「どうせ作るなら本当に動くものを作ろう」と思い、
デーモン・マイナー・エクスプローラ・ネットワークまで構築しました。
独自PoWアルゴリズム「RinHash」
RinCoinの最大の特徴が RinHash です。
RinHashの構成
BLAKE3 ↓
Argon2d(メモリハード) ↓
SHA3-256
設計意図
-
BLAKE3
高速で入力を拡散(GPU向き) -
Argon2d
メモリハード化・ASIC耐性
RinCoinでは軽量設定(64KB)から開始 -
SHA3-256
最終ハッシュの安定性と検証の容易さ
RinHash(C実装例)
以下は実際に使用している処理構成を簡略化した例です。
void rinhash(const uint8_t *input, size_t len, uint8_t *output)
{
uint8_t blake3_out[32];
uint8_t argon2_out[32];
// 1. BLAKE3
blake3_hasher hasher;
blake3_hasher_init(&hasher);
blake3_hasher_update(&hasher, input, len);
blake3_hasher_finalize(&hasher, blake3_out, 32);
// 2. Argon2d
argon2d_hash_raw(
2, // time cost
64, // memory cost (KB)
1, // lanes
blake3_out,
32,
"RinCoinSalt",
11,
argon2_out,
32
);
// 3. SHA3-256
sha3_256(output, 32, argon2_out, 32);
}
マイナー実装(CPU / GPU)
CPUマイナー
cpuminer-opt ベース
RinHashをCで実装
Stratum / GBT 対応
GPUマイナー
CUDAで RinHash を完全実装
Argon2d を GPU向けに移植
nonce をバッチ処理して高速化
正直、Argon2dのCUDA実装が一番大変でした。
デーモン側(コア)
Bitcoin Core / Litecoin 系をベースに改造
PoW検証に RinHash を使用
ブロックハッシュも RinHash(Bitcoinのような reverse はしない)
実際に運用してみて
良かった点
PoWやマイニングの理解が飛躍的に深まった
GPU最適化・並列処理・エンディアン問題を実体験できた
理論ではなく「現実の仮想通貨」が分かる
つらかった点
CUDA + Argon2d のデバッグ
Stratumの仕様差
マイナーとデーモンの微妙な差分による不整合
エクスプローラ・取引所対応
作って分かったこと
仮想通貨開発は「コード量」より「デバッグ量」
PoWは速さより検証の正確さ
個人でも「動く仮想通貨」は作れる
開発を進める上で英語の知識も必要であると感じました
おわりに
RinCoinは現在もコミュニティにより開発・運用を継続されています。
仮想通貨を作ってみたい
PoWを本気で理解したい
GPUマイナーを書いてみたい
という人には、一度は自作してみることを本気でおすすめします。