Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@kosamit

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

More than 1 year has passed since last update.

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
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kosamit
PHI.incのチーフエンジニア。 Rubyエンジニア。IOSTブロックチェーンを使ったシステム開発を行なっています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?