コードを読んだり書いたりして調べた。
ブツ
インストール&実行
NAME='Node.js.CoinInfo.All.20220921114114'
git clone https://github.com/ytyaru/$NAME
cd $NAME
npm install
node index.js
プロジェクト作成
NAME=hello-coininfo
mkdir $NAME
cd $NAME
npm init -y
npm i tiny-secp256k1 ecpair coininfo bitcoinjs-lib
node index.js
ソースコード作成
vim index.js
追記
コメントでObject.keysを教えていただきました。おかげさまで綺麗なコードが書けました。ありがとうございます。
コード
const tinysecp = require('tiny-secp256k1');
const coininfo = require('coininfo');
const ecpair = require('ecpair');
const bitcoin = require('bitcoinjs-lib');
const names = Object.keys(coininfo)
const units = Object.values(coininfo).map(coin=>coin.main.unit)
console.assert(names.length === units.length)
for (let i=0; i<names.length; i++) {
console.log(`${units[i]}\t${names[i]}`)
}
実行結果
BCH bitcoincash
BLK blackcoin
BTC bitcoin
BTG bitcoin gold
RYO c0ban
CITY citycoin
DASH dash
DNR denarius
DCR decred
DGB digibyte
DOGE dogecoin
GRS groestlcoin
LTC litecoin
VIA viacoin
MONA monacoin
NBT nubits
NMC namecoin
PPC peercoin
QTUM qtum
RVN ravencoin
RDD reddcoin
VTC vertcoin
x42 x42
ZEC zcash
ソートしたほうがいいのでは? と一瞬おもったが、デフォルト順でnames
とunits
の順序が対応しているのでソートしないほうがいい。
もしnames
とunits
が各自ソートしてしまったら対応順が狂ってしまう。たとえばunits
の5つ目にあるRYO
とか。これはc0ban
という名前と対応しているはず。でもRYO
のほうは辞書順でソートすると(RVN
の下)にいってしまう。なのでソートしないまま使った。
旧コード
上のコードと比べると、どれだけ残念なことをしていたかよくわかる。
じつは下のコードを書いているとき「なんかもっといい方法ないのか」と思っていたものの、具体的にどうすればいいかわからず。JavaScriptの知識が足りていないことが露呈。コメントで教えていただき勉強できた。感謝!
const tinysecp = require('tiny-secp256k1');
const coininfo = require('coininfo');
const ecpair = require('ecpair');
const bitcoin = require('bitcoinjs-lib');
//console.log('coininfo:', coininfo) // 成功だがオブジェクト。ここからunitだけを取得したい。
//console.log('coininfo:', coininfo.keys()) // エラー
//console.log('coininfo:', coininfo().keys()) // エラー
//console.log('coininfo.supportedCoins:', coininfo.supportedCoins) // エラー
console.log(coininfo.bitcoincash.main.unit)
console.log(coininfo.blackcoin.main.unit)
console.log(coininfo.bitcoin.main.unit)
console.log(coininfo['bitcoin gold'].main.unit)
console.log(coininfo.c0ban.main.unit)
console.log(coininfo.citycoin.main.unit)
console.log(coininfo.dash.main.unit)
console.log(coininfo.denarius.main.unit)
console.log(coininfo.decred.main.unit)
console.log(coininfo.digibyte.main.unit)
console.log(coininfo.dogecoin.main.unit)
console.log(coininfo.groestlcoin.main.unit)
console.log(coininfo.litecoin.main.unit)
console.log(coininfo.viacoin.main.unit)
console.log(coininfo.monacoin.main.unit)
console.log(coininfo.nubits.main.unit)
console.log(coininfo.namecoin.main.unit)
console.log(coininfo.peercoin.main.unit)
console.log(coininfo.qtum.main.unit)
console.log(coininfo.ravencoin.main.unit)
console.log(coininfo.reddcoin.main.unit)
console.log(coininfo.vertcoin.main.unit)
console.log(coininfo.x42.main.unit)
console.log(coininfo.zcash.main.unit)
console.log('------------------------------------')
console.log(coininfo.bitcoincash.main.name)
console.log(coininfo.blackcoin.main.name)
console.log(coininfo.bitcoin.main.name)
console.log(coininfo['bitcoin gold'].main.name)
console.log(coininfo.c0ban.main.name)
console.log(coininfo.citycoin.main.name)
console.log(coininfo.dash.main.name)
console.log(coininfo.denarius.main.name)
console.log(coininfo.decred.main.name)
console.log(coininfo.digibyte.main.name)
console.log(coininfo.dogecoin.main.name)
console.log(coininfo.groestlcoin.main.name)
console.log(coininfo.litecoin.main.name)
console.log(coininfo.viacoin.main.name)
console.log(coininfo.monacoin.main.name)
console.log(coininfo.nubits.main.name)
console.log(coininfo.namecoin.main.name)
console.log(coininfo.peercoin.main.name)
console.log(coininfo.qtum.main.name)
console.log(coininfo.ravencoin.main.name)
console.log(coininfo.reddcoin.main.name)
console.log(coininfo.vertcoin.main.name)
console.log(coininfo.x42.main.name)
console.log(coininfo.zcash.main.name)
結果
BCH
BLK
BTC
BTG
RYO
CITY
DASH
DNR
DCR
DGB
DOGE
GRS
LTC
VIA
MONA
NBT
NMC
PPC
QTUM
RVN
RDD
VTC
x42
ZEC
------------------------------------
BitcoinCash
BlackCoin
Bitcoin
Bitcoin Gold
c0ban
CityCoin
Dash
Denarius
Decred
DigiByte
Dogecoin
Groestlcoin
Litecoin
Viacoin
Monacoin
NuBits
Namecoin
Peercoin
Qtum
Ravencoin
ReddCoin
Vertcoin
x42
Zcash
実行
node index.js
とりあえずこれをunit.txt
, name.txt
にそれぞれ保存した。
そしてその2つをくっつけてTSVにした。
paste -d '\t' unit.txt name.txt > coins.tsv
単位 | 名前 |
---|---|
BCH |
BitcoinCash |
BLK |
BlackCoin |
BTC |
Bitcoin |
BTG |
Bitcoin Gold |
RYO |
c0ban |
CITY |
CityCoin |
DASH |
Dash |
DNR |
Denarius |
DCR |
Decred |
DGB |
DigiByte |
DOGE |
Dogecoin |
GRS |
Groestlcoin |
LTC |
Litecoin |
VIA |
Viacoin |
MONA |
Monacoin |
NBT |
NuBits |
NMC |
Namecoin |
PPC |
Peercoin |
QTUM |
Qtum |
RVN |
Ravencoin |
RDD |
ReddCoin |
VTC |
Vertcoin |
x42 |
x42 |
ZEC |
Zcash |
ビットコインと名のつくものが3つもある。BTC
がビットコインだと思われる。
私が知っているのはせいぜいモナコイン、ビットコイン、ライトコインくらい。
世の中には数万種類もの暗号通貨があるらしい。
試行
coininfo('コイン名')
のうち引数で渡すコイン名一覧がほしかった。でもREADMEにはそれらしいメソッドやプロパティは書いてなかった。なので色々試した。
試行1
const coininfo = require('coininfo');
console.log(coininfo.keys())
console.log(coininfo().keys())
エラー。
試行2
console.log(coininfo))
色々出た。でもコインの名だけ欲しい。
試行3
coininfo('コイン名')
のうち引数で渡すコイン名一覧がほしかった。なのにcoininfo
にはそれを返すプロパティやメソッドがない。READMEにも書いてない。そんなバカなと思ってコードを読んでみたら、内部でもってるだけで外部に渡さない設計だった……。
supportedCoins
という変数でオブジェクトとして持っている。
...
var supportedCoins = {}
...
supportedCoins[unit] = coin.main
supportedCoins[name] = coin.main
...
supportedCoins
を外部にも公開してほしかった。
以下のようにしてもundefined
。参照できない。
const coininfo = require('coininfo');
console.log('coininfo.supportedCoins:', coininfo.supportedCoins)
試行4
コメントでObject.keysを教えていただき綺麗なコードで書けました。ありがとうございます。