<p>you are doing all wrong from starting, do not use WalletAppKit use simple Wallet class, its offline wallet not Online, WalletAppKit needs internet to sync with the blockchain</p>

<pre><code>public void wallet()
{
    wallet = new Wallet(params);
    try
    {
        if(isDirCreated())
        {
            System.out.print("New Wallet");
            wallet.saveToFile(walletPath);
            System.out.println(wallet.currentReceiveAddress());
        }
        else
        {
            System.out.println("Load Wallet");
            // do something here
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
</code></pre>

CC BY-SA 4.0
2018-05-23T20:26:42.690Z
2018-05-23T20:26:42.690Z
Zombie
<p>I am new to bitcoins, I want to create an offline wallet on Android, to scan transaction QR code from online Desktop wallet, Sign that transaction with private key on my offline wallet.</p>

<p>1 Creating offline wallet.
2.Signing transaction offline with private key.</p>

<p>I want to sign transaction and generate QR code from that sign transaction.But after signing i get a sha256 in this form "MEQCIGBVDN/PkbESZdWkG6/KzrDRAEpDXVdsjKMzErBfFIWYAiA8JJOv97Dlp8Acg/L8JHI3RzoW                                                                       eYNxPW1Lx4wQaORNNQ==", so what will i do with this. So please help and review my code. Is my signing process ok or if not please comeup with some code.Thanks</p>

<p>So for i did the following.</p>

<p>// For creating wallet</p>

<p>private void InitilizeWallet() </p>

<p>throws IOException {</p>

<pre><code>    BriefLogFormatter.init();

    params = TestNet3Params.get();

    filePrefix = "forwarding-service-testnet";

    walletAppKit = new WalletAppKit(params, getCacheDir(), filePrefix) {
        @Override
        protected void onSetupCompleted() {

           if (wallet().getKeyChainGroupSize() &lt; 1)
                wallet().importKey(new ECKey());

            deterministicKey = wallet().getWatchingKey().dropPrivateBytes();
            deterministicKey = HDKeyDerivation.createMasterPubKeyFromBytes(deterministicKey.getPubKey(), deterministicKey.getChainCode());
            xPublicKey = deterministicKey.serializePubB58(params);    privateKey=wallet().getKeyByPath(DeterministicKeyChain.ACCOUNT_ZERO_PATH).getPrivateKeyAsWiF(params);
            Log.e("key", xPublicKey.toString());
            Log.e("privatekey", privateKey.toString());

        }
    };


    if (params == RegTestParams.get()) {
        // Regression test mode is designed for testing and development only, so there's no public network for it.
        // If you pick this mode, you're expected to be running a local "bitcoind -regtest" instance.
        walletAppKit.connectToLocalHost();
    }
    // Download the block chain and wait until it's done.


    walletAppKit.startAsync();
    walletAppKit.awaitRunning();

}
</code></pre>

<p>And for signing transaction i do the following.</p>

<p>public void Createtransictionhash(String recipientAddress, String amount) {</p>

<pre><code>    try {

          // i am getting address and coins from QR code

        SendRequest request = SendRequest.to(Address.fromBase58(params, 
        recipientAddress), Coin.parseCoin(amount));
            Signingtrasaction(MainActivity.privateKey,request.tx.getHashAsString());

        Log.e("txhash", request.tx.getHashAsString());

    } catch (Exception e) {
        Log.e("msgError", e.getMessage().toString());
        Toast.makeText(getApplicationContext(), " Version code of address did not match", Toast.LENGTH_SHORT).show();

    }
}

public void Signingtrasaction(String wif, String msg) {
    try {


        // message (hash) to be signed with private key
        //String msg = "15953935a135031bfec37d36a9d662aea43e1deb0ea463d6932ac6e537cb3e81";
        //my hash = 09b14f746bd0a93b71907ba0070a103adbee7b1a260e053a21aa0b660ad8de57
        // an example of WiF for private key (taken from 'Mastering Bitcoin')
       // wif ="KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ";

        // creating a key object from WiF
        DumpedPrivateKey dpk = DumpedPrivateKey.fromBase58(params, wif);
        ECKey key = dpk.getKey();

        // checking our key object
       // NetworkParameters main = MainNetParams.get();
        String check = key.getPrivateKeyAsWiF(params);
        System.out.println(wif.equals(check));  // true
        Log.e("wif check", String.valueOf(wif.equals(check)));
        // creating Sha object from string
        Sha256Hash hash = Sha256Hash.wrap(msg);

        // creating signature
        ECKey.ECDSASignature sig = key.sign(hash);

        // encoding
        byte[] res = sig.encodeToDER();

        // converting to hex
        //String hex = DatatypeConverter.printHexBinary(res);
        // String hex = new String(res);
        String hex = android.util.Base64.encodeToString(res, 16);

        Log.e("sigendTransiction", hex.toString());

        Log.e("decrypttx",""+ Hex.decode(sig.encodeToDER()));

    } catch (Exception e) {   //signingkey = ecdsa.from_string(privateKey.decode('hex'), curve=ecdsa.SECP256k1)
        Log.e("signing exception", e.getMessage().toString());
    }
}
</code></pre>

<bitcoinj><java><android>
How to create an offline wallet on Android only to sign transaction
Nain Kazi
# How to create an offline wallet on Android only to sign transaction

(Asked by: username_0 on 2018-01-12)

I am new to bitcoins, I want to create an offline wallet on Android, to scan transaction QR code from online Desktop wallet, Sign that transaction with private key on my offline wallet.

1 Creating offline wallet.
2.Signing transaction offline with private key.

I want to sign transaction and generate QR code from that sign transaction.But after signing i get a sha256 in this form "MEQCIGBVDN/PkbESZdWkG6/KzrDRAEpDXVdsjKMzErBfFIWYAiA8JJOv97Dlp8Acg/L8JHI3RzoW eYNxPW1Lx4wQaORNNQ==", so what will i do with this. So please help and review my code. Is my signing process ok or if not please comeup with some code.Thanks

So for i did the following.

// For creating wallet

private void InitilizeWallet()

throws IOException {

```
    BriefLogFormatter.init();

    params = TestNet3Params.get();

    filePrefix = "forwarding-service-testnet";

    walletAppKit = new WalletAppKit(params, getCacheDir(), filePrefix) {
        @Override
        protected void onSetupCompleted() {

           if (wallet().getKeyChainGroupSize() < 1)
                wallet().importKey(new ECKey());

            deterministicKey = wallet().getWatchingKey().dropPrivateBytes();
            deterministicKey = HDKeyDerivation.createMasterPubKeyFromBytes(deterministicKey.getPubKey(), deterministicKey.getChainCode());
            xPublicKey = deterministicKey.serializePubB58(params);    privateKey=wallet().getKeyByPath(DeterministicKeyChain.ACCOUNT_ZERO_PATH).getPrivateKeyAsWiF(params);
            Log.e("key", xPublicKey.toString());
            Log.e("privatekey", privateKey.toString());

        }
    };

    if (params == RegTestParams.get()) {
        // Regression test mode is designed for testing and development only, so there's no public network for it.
        // If you pick this mode, you're expected to be running a local "bitcoind -regtest" instance.
        walletAppKit.connectToLocalHost();
    }
    // Download the block chain and wait until it's done.

    walletAppKit.startAsync();
    walletAppKit.awaitRunning();

}

```

And for signing transaction i do the following.

public void Createtransictionhash(String recipientAddress, String amount) {

```
    try {

          // i am getting address and coins from QR code

        SendRequest request = SendRequest.to(Address.fromBase58(params, 
        recipientAddress), Coin.parseCoin(amount));
            Signingtrasaction(MainActivity.privateKey,request.tx.getHashAsString());

        Log.e("txhash", request.tx.getHashAsString());

    } catch (Exception e) {
        Log.e("msgError", e.getMessage().toString());
        Toast.makeText(getApplicationContext(), " Version code of address did not match", Toast.LENGTH_SHORT).show();

    }
}

public void Signingtrasaction(String wif, String msg) {
    try {

        // message (hash) to be signed with private key
        //String msg = "15953935a135031bfec37d36a9d662aea43e1deb0ea463d6932ac6e537cb3e81";
        //my hash = 09b14f746bd0a93b71907ba0070a103adbee7b1a260e053a21aa0b660ad8de57
        // an example of WiF for private key (taken from 'Mastering Bitcoin')
       // wif ="KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ";

        // creating a key object from WiF
        DumpedPrivateKey dpk = DumpedPrivateKey.fromBase58(params, wif);
        ECKey key = dpk.getKey();

        // checking our key object
       // NetworkParameters main = MainNetParams.get();
        String check = key.getPrivateKeyAsWiF(params);
        System.out.println(wif.equals(check));  // true
        Log.e("wif check", String.valueOf(wif.equals(check)));
        // creating Sha object from string
        Sha256Hash hash = Sha256Hash.wrap(msg);

        // creating signature
        ECKey.ECDSASignature sig = key.sign(hash);

        // encoding
        byte[] res = sig.encodeToDER();

        // converting to hex
        //String hex = DatatypeConverter.printHexBinary(res);
        // String hex = new String(res);
        String hex = android.util.Base64.encodeToString(res, 16);

        Log.e("sigendTransiction", hex.toString());

        Log.e("decrypttx",""+ Hex.decode(sig.encodeToDER()));

    } catch (Exception e) {   //signingkey = ecdsa.from_string(privateKey.decode('hex'), curve=ecdsa.SECP256k1)
        Log.e("signing exception", e.getMessage().toString());
    }
}

```

**Tags:** bitcoinj, java, android


---

## 1 answers

### Answer by username_1 on 2018-05-23. Score: 1 | Accepted answer

you are doing all wrong from starting, do not use WalletAppKit use simple Wallet class, its offline wallet not Online, WalletAppKit needs internet to sync with the blockchain

```
public void wallet()
{
    wallet = new Wallet(params);
    try
    {
        if(isDirCreated())
        {
            System.out.print("New Wallet");
            wallet.saveToFile(walletPath);
            System.out.println(wallet.currentReceiveAddress());
        }
        else
        {
            System.out.println("Load Wallet");
            // do something here
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

```


---

