AbsaOSS / rn-indy-sdk

This code was starting point of https://github.com/hyperledger/indy-sdk-react-native where the work continues.
Apache License 2.0
11 stars 6 forks source link

Unable to Open Pool Ledger #18

Closed TheArhaam closed 3 years ago

TheArhaam commented 3 years ago

So I've run the following and it worked:

const config = {
      genesis_txn: path,
}
const result = await indy.createPoolLedgerConfig('test', JSON.stringify(config));

However, I'm not getting any response (Pool Handle) when opening the pool ledger, I've tried the following:

  1. indy.openPoolLedger('test', JSON.stringify(config))
  2. indy.openPoolLedger('test', null)
  3. indy.openPoolLedger('test', '{}')
TimoGlastra commented 3 years ago

Which version of react native are you using?

Could it be related to this issue? Please check if you can reproduce the problem in version 0.61.5 of RN

TheArhaam commented 3 years ago

@TimoGlastra Well myreact-native version is 0.63.2, I will try using 0.61.5 and see if the issue persists. Will get back to you shortly, Thank you 😄

TheArhaam commented 3 years ago

@TimoGlastra I am facing the same issue with react-native version 0.61.5 😭 Have you tested out the rn-indy-sdk completely in your fork?

I've referred to a couple of examples of the Indy SDK and it doesn't seem like I'm missing anything but here is the code I'm currently using:

import React, { Component } from "react";
import { ScrollView, View, Text, TouchableOpacity, StyleSheet } from "react-native";
import indy from 'rn-indy-sdk';
import RNFS from 'react-native-fs';
import axios from "axios";

class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
      wallethandle: null,
      poolhandle: null
    }
  }

  // =========================================
  // FILE SYSTEM
  // =========================================
  getFiles = () => {
    RNFS.readDir(RNFS.DocumentDirectoryPath)
      .then((result) => {
        console.log('GOT RESULT', result);

        // stat the first file
        return Promise.all([RNFS.stat(result[0].path), result[0].path]);
      })
      .catch((err) => {
        console.log(err.message, err.code);
      });
  }

  createGenFile = async () => {
    console.log("CREATE GEN FILE")
    let genesis;
    // get genesis transactions
    await axios.get('http://dev.greenlight.bcovrin.vonx.io/genesis')
      .then(async (res) => {
        genesis = res.data;
        console.log("==================================")
        console.log("GENESIS")
        console.log("==================================")
        console.log(genesis)

        // write genesis to file
        var path = RNFS.DocumentDirectoryPath + '/indy_genesis_transactions.txt';
        console.log("PATH: " + path)
        await RNFS.writeFile(path, genesis, 'utf8')
          .then((success) => {
            console.log('[GEN FILE] WRITTEN!');
          })
          .catch((err) => {
            console.log(err.message);
          });

      })
      .catch((err) => {
        console.log('[AXIOS] ERR: ' + err);
      })
  }

  // =========================================
  // POOL
  // =========================================
  createPool = async () => {
    console.log("CREATE POOL LEDGER CONFIG")
    var path = RNFS.DocumentDirectoryPath + '/indy_genesis_transactions.txt';
    const config = {
      genesis_txn: path,
    }
    console.log("CONFIG: " + JSON.stringify(config))
    const result =
      await indy.createPoolLedgerConfig('test9', JSON.stringify(config))
        .then(async (res) => {
          console.log('POOL LEDGER CONFIG CREATED')
          console.log('Result: ' + res)
        })
        .catch((err) => {
          console.log("ERR: " + err)
        });
  }

  openPool = async () => {
    console.log("OPEN POOL LEDGER")
    var path = RNFS.DocumentDirectoryPath + '/indy_genesis_transactions.txt';
    const config = {
      genesis_txn: path,
    }
    console.log("CONFIG: " + JSON.stringify(config))
    await indy.openPoolLedger('test9', '{}')
      .then((res) => {
        console.log('POOL LEDGER OPENED');
        console.log('POOL HANDLE: ' + res);
        this.setState({
          poolhandle: result
        })
      })
      .catch((err) => {
        console.log('OPEN POOL ERR: ' + err);
      });
  }

  render() {
    return (
      <ScrollView>
        {/* CREATE GEN FILE */}
        <TouchableOpacity onPress={() => { this.createGenFile() }}>
          <View style={styles.bttn} >
            <Text style={styles.txt}>Create Gen File</Text>
          </View>
        </TouchableOpacity>
        {/* GET FILES */}
        <TouchableOpacity onPress={() => { this.getFiles() }}>
          <View style={styles.bttn} >
            <Text style={styles.txt}>Get Files</Text>
          </View>
        </TouchableOpacity>
        {/* CREATE POOL LEDGER CONFIG */}
        <TouchableOpacity onPress={() => { this.createPool() }}>
          <View style={styles.bttn} >
            <Text style={styles.txt}>Create Pool Ledger Config</Text>
          </View>
        </TouchableOpacity>
        {/* OPEN POOL LEDGER */}
        <TouchableOpacity onPress={() => { this.openPool() }}>
          <View style={styles.bttn} >
            <Text style={styles.txt}>Open Pool Ledger</Text>
          </View>
        </TouchableOpacity>
      </ScrollView>
    );
  }

}

// STYLES - STYLESHEET
const styles = StyleSheet.create({
  bttn: {
    backgroundColor: 'lightblue',
    padding: 20,
    margin: 20
  },
  txt: {
    color: 'black',
    textAlign: 'center'
  }
});

export default App;

NOTE: I've tried the following for openPoolLedger() :

  1. indy.openPoolLedger('test', JSON.stringify(config))
  2. indy.openPoolLedger('test', null)
  3. indy.openPoolLedger('test', '{}') Not really sure which one is correct.
TimoGlastra commented 3 years ago

I'm able to reproduce your error in RN > 0.61.5, but not 0.61.5. However i'm using the master version of rn-indy-sdk instead of the NPM version. So could you check once again, but this time with version 0.65.1 and the master branch? To run with the master branch:

git clone https://github.com/AbsaOss/rn-indy-sdk
cd rn-indy-sdk
yarn install
yarn pack

this will output a file rn-indy-sdk-v0.1.3.tgz that you can then add to your react native project. Inside your react native project run:

yarn add file:../path/to/rn-indy-sdk/rn-indy-sdk-v0.1.3.tgz

Do note that the master branch doesn't expect strings as parameters, but JSON objects:

// NPM rn-indy-sdk
indy.createPoolLedgerConfig('test9', JSON.stringify(config))

// master rn-indy-sdk
indy.createPoolLedgerConfig('test9', config)

For the openPoolLedger it is fine to call without a second parameter (openPoolLedger('test9')). Also make sure to call setProtocolVersion(2) before opening the pool.

Working example ```javascript import {View, Text} from 'react-native'; import React, {useEffect} from 'react'; import indy from 'rn-indy-sdk'; import axios from 'axios'; import RNFS from 'react-native-fs'; const App = () => { useEffect(() => { async function internal() { const walletId = `test-wallet-${Math.random()}`; console.log('walletId', walletId); const poolName = `test-pool-${Math.random()}`; console.log('poolName', poolName); await indy.createWallet({id: walletId}, {key: 'test'}); const walletHandle = await indy.openWallet({id: walletId}, {key: 'test'}); console.log('walletHandle', walletHandle); const response = await axios.get( 'http://dev.greenlight.bcovrin.vonx.io/genesis', ); const genesisPath = RNFS.DocumentDirectoryPath + '/genesis.txn'; console.log('genesisPath', genesisPath); await RNFS.writeFile(genesisPath, response.data, 'utf8'); const config = { genesis_txn: genesisPath, }; await indy.createPoolLedgerConfig(poolName, config); await indy.setProtocolVersion(2); const poolHandle = await indy.openPoolLedger(poolName); console.log('poolHandle', poolHandle); } internal(); }, []); return ( Hello World ); }; export default App; ```

Let me know if you can get it to work!

TheArhaam commented 3 years ago

@TimoGlastra Thank you for all your help, turns out all I had to do was add indy.setProtocolVersion(2) 😅. It's working now, I was able to get the Pool Handle. I'm not sure what this function does, I would appreciate it if you could give me a brief explanation 😅

Also, would you recommend I use the master branch going forward? Or should I stick to the current npm package?

TimoGlastra commented 3 years ago

For the protocol version, see the indy-sdk docs. It defaults to 1. From the docs: "Protocol version will be used: 1 - for Indy Node 1.3 2 - for Indy Node 1.4 and greater". I believe indy node version is already at something like level 1.12, so you'll probably always need version 2.

For using the master branch: I would say yes at the moment. The NPM package isn't updated in a while, and as the package is in early stage development you'll probably get the fixes quicker

TheArhaam commented 3 years ago

@TimoGlastra Alright, thank you so much for all the help. 😄