Elixirで、RubyのArray#packなことをする


はじめに

  • Monacoinのtestnet4に、とあるコインベーストランザクションがあります
  • 以下、抜粋です

  • coinbaseのところの "coinbase": "03e9bc0a42656c6965766520696e20796f7572207370697269742e20476f20666f7274682e00000000" これはなんと書いてあるのかなー? と

    • 先頭のほうの03e9bc0a00000000を外した"42656c6965766520696e20796f7572207370697269742e20476f20666f7274682e"を以下読んでみます
    • 先頭のほうはたしかブロック高(だった気がする)
    • うしろのほうのやつは0だからいいでしょう
    • 16進文字列(上位ニブルが先)の形式になっています
  • Monacoin testnet4 Faucet |> これ動かしているのです

    • 2017/10月か11月くらいから動かしています

Rubyなら

irb(main):002:0> ['42656c6965766520696e20796f7572207370697269742e20476f20666f7274682e'].pack('H*')
=> "Believe in your spirit. Go forth."

Elixirなら

  • 最近はElixirにハマっていまして、Elixirならどうやるんやろうなあーとおもってiexと戯れてみました
  • Enum.chunk_every/2 がステキです!
iex(8)> (
...(8)> "42656c6965766520696e20796f7572207370697269742e20476f20666f7274682e"
...(8)> |> String.codepoints
...(8)> |> Enum.chunk_every(2)
...(8)> |> Enum.map(fn [a,b] -> "#{a}#{b}" end)
...(8)> |> Enum.map(&String.to_integer(&1, 16))
...(8)> |> List.to_string
...(8)> )
"Believe in your spirit. Go forth."
  • もっと短くできるかもしれませんが愚直にやってみました
  • Thanks Elixir!
  • できた、できた