So erstellen Sie eine Offline-Wallet auf Android, nur um Transaktionen zu signieren

Ich bin neu bei Bitcoins, ich möchte eine Offline-Wallet auf Android erstellen, um den Transaktions-QR-Code von der Online-Desktop-Wallet zu scannen und diese Transaktion mit dem privaten Schlüssel in meiner Offline-Wallet zu signieren.

1 Offline-Wallet erstellen. 2.Transaktion offline mit privatem Schlüssel signieren.

Ich möchte die Transaktion signieren und einen QR-Code aus dieser signierten Transaktion generieren. Aber nach dem Signieren erhalte ich einen sha256 in dieser Form "MEQCIGBVDN/PkbESZdWkG6/KzrDRAEpDXVdsjKMzErBfFIWYAiA8JJOv97Dlp8Acg/L8JHI3RzoW eYNxPW1Lx4wQaORNNQ==", also was mache ich damit. Also bitte helfen Sie und überprüfen Sie meinen Code. Ist mein Signiervorgang in Ordnung, oder falls nicht, geben Sie bitte einen Code ein. Danke

Also habe ich folgendes gemacht.

// Zum Erstellen einer Brieftasche

private void InitilizeWallet()

wirft 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();

}

Und für die Unterzeichnung der Transaktion mache ich Folgendes.

public void Createtransictionhash (String Empfängeradresse, String-Betrag) {

    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());
    }
}

Antworten (1)

Sie machen von Anfang an alles falsch, verwenden Sie WalletAppKit nicht, verwenden Sie die einfache Wallet-Klasse, die Offline-Brieftasche ist nicht online, WalletAppKit benötigt das Internet, um mit der Blockchain zu synchronisieren

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();
    }
}