JavaScript
Blockchain
暗号
NEM
nem #2Day 3

NEMアカウントを作ろう!

3日目となりました。
それでは暗号通貨NEMを始めましょう。

準備するものはテキストエディタとインターネットにつながるブラウザだけです。
ロジックも最小構成を目指していきます。なんでもかんでも実現できるsdkもありますが、秘密鍵を扱う暗号通貨がどのような仕組みでそのセキュリティを保っているのかを知るのはとても大切なことです。

index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>

    <!-- ライブラリ -->

    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
    <script src="nacl-fast.js"></script>
    <script src="xembook-sdk.js"></script>

    <!-- app -->
    <script>
//ここにロジックを追加していきます

    </script>
  </body>
</html>
let networkId = 0x68000000;//104
let privateKey = ua2hex(crypto.getRandomValues(new Uint8Array(32)));
let kp = KeyPair.create(privateKey);
let address = toAddress(kp.publicKey.toString(), networkId);

これで暗号通貨を送信するために必要な秘密鍵とアカウントアドレスの生成に成功しました。
(privateKey,address)

networkId = 0x68000000 はNEMメインネットのIDとなります。
crypto.getRandomVluesでランダムの文字列を発生させます。
Uint8Array(32)で示すとおり、1バイトサイズで32個の配列を作成します。
それらの配列の一つ一つを16進数に変換し文字列で表現したものが一般的によくみる秘密鍵となります。

つぎにKeyPairクラスを生成し秘密鍵を喰わせます。
以後はKeyPairクラスが公開鍵を生成できるようなるので、そこからNEM専用のアドレスを作り出します。

ここでちょっと要注意です。
crypto.getRandomValuesというランダム関数はjs標準関数となっており、ブラウザによっては非対応の場合があります。

調べてみるとIE11ではこの関数がサポートされていないようです。ではNanoWalletはどういう風なロジックを組んでいるのでしょうか?

最近のバーションでは秘密鍵の導出部分が以下のように書き換えられています。

let privateKey = ua2hex(nacl.randomBytes(32));

これによってIE11でサポートされるmsCryptoと上手に使い分けているようです。
なお、Android4.2など古いスマートフォンではgetRandomValuesがサポートされておらず、これらの機種でブラウザを使用して暗号強度の高い秘密鍵を生成することは不可能です。
秘密鍵はかならずPCなどで生成するようにしましょう。

OSがAndroid端末の脆弱性対応状況を表にしたら絶望的だった
https://iwb.jp/os-android-vulnerability/