1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

React Native Expoでiost.jsを読み込む

Last updated at Posted at 2020-02-18

React Native Expoからiost.jsを読み込む方法です。

手順

1.必要なパッケージのインストール

npm install rn-nodeify -g
npm install --save crypto-browserify iost expo-random

2. crypto以外のstandard libraryをインストール

以下を実行してstandard libraryのReact Native版をインストールしてください。

rn-nodeify --install 'buffer,events,http,https,os,process,stream,tty,url,util,vm,zlib' --hack

ルートフォルダにshim.jsができるので、App.jsの先頭にimport文を追記します。

import './shim.js'

3. randomBytesをexpo-randomのgetRandomBytesAsyncに変える

tweetnaclフォルダのnacl-fast.jsを書き換えます。

以下の変更後のコードをnode_modules/tweetnacl/nacl-fast.jsと入れ替えてください。
https://gist.github.com/kosamit/fa678743be94fab49019611cf8360768#file-nacl-fast-js

node_modules/tweetnacl/nacl-fast.jsの変更内容

expo-randomのパッケージを読み込み、crypto.getRandomValuesをRandom.getRandomBytesAsyncに変えました。

差分↓

@@ -2363,24 +2363,24 @@
 (function() {
   // Initialize PRNG if environment provides CSPRNG.
   // If not, methods calling randombytes will throw.
+  var Random = require('expo-random');
   var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null;
   if (crypto && crypto.getRandomValues) {
     // Browsers.
     var QUOTA = 65536;
-    nacl.setPRNG(function(x, n) {
+    nacl.setPRNG(async function(x, n) {
       var i, v = new Uint8Array(n);
       for (i = 0; i < n; i += QUOTA) {
-        crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));
+        await Random.getRandomBytesAsync(v.subarray(i, i + Math.min(n - i, QUOTA)));
       }
       for (i = 0; i < n; i++) x[i] = v[i];
       cleanup(v);
     });
   } else if (typeof require !== 'undefined') {
     // Node.js.
-    crypto = require('crypto');
-    if (crypto && crypto.randomBytes) {
-      nacl.setPRNG(function(x, n) {
-        var i, v = crypto.randomBytes(n);
+    if (true) {
+      nacl.setPRNG(async function(x, n) {
+        var i, v = await Random.getRandomBytesAsync(n);
         for (i = 0; i < n; i++) x[i] = v[i];
         cleanup(v);
       });

4. iost.jsを読み込む

使いたい場所で以下のコードでnode_modules/iost/indexを読み込んでください。
require('iost')とするとcryptoパッケージが読み込めないエラーが発生します。

import IOST from './node_modules/iost/index';

注意

1. rn-nodeifyで入れたパッケージは再インストールする必要がある場合がある

rn-nodeifyで入れたパッケージはたまに再インストールしなければいけない場合があります。
以下をpackage.jsonのscriptsに追記し、再起動したらnpm run postinstallを実行してください。

package.json
"scripts": {
	
    "postinstall": "rn-nodeify --install 'buffer,events,http,https,os,process,stream,tty,url,util,vm,zlib' --hack"
  },

2. bs58パッケージはIOSTから読み込む

bs58はrequireせずにimportしたIOSTから使ってください。

let bs58 = IOST.Bs58;
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?