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を実行してください。
"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;