Cómo usar electrum RPC para obtener el saldo de direcciones en Windows

$ ./electrum-3.2.3.exe --testnet setconfig rpcport 7777
true
$ ./electrum-3.2.3.exe --testnet setconfig rpcuser blah
true
$ ./electrum-3.2.3.exe --testnet setconfig rpcpassword blah
true

$ ./electrum-3.2.3.exe --testnet daemon start
Traceback (most recent call last):
  File "run_electrum", line 433, in <module>
AttributeError: module 'os' has no attribute 'fork'

No puedo instalar en Linux porque centos 7.5 no puede compilar python3. No intentaré más porque ya he perdido un día en problemas de compilación.

$ ./electrum-3.2.3.exe --testnet

inicia un cliente gui que está bien

$ curl --data-binary '{"id":"curltext","method":"blockchain.scripthash.get_balance","params":["mveNDYcr9Bb1xjnNeCRumiDHKU3n3CJBuk"]}' http://blah:blah@127.0.0.1:7777
{"result": null, "id": "curltext", "error": {"code": -32601, "message": "Method blockchain.scripthash.get_balance not supported."}}
$ curl --data-binary '{"id":"curltext","method":"get_balance","params":["mveNDYcr9Bb1xjnNeCRumiDHKU3n3CJBuk"]}' http://blah:blah@127.0.0.1:7777
{"result": null, "id": "curltext", "error": {"code": -32601, "message": "Method get_balance not supported."}}
$ curl --data-binary '{"id":"curltext","method":"getbalance","params":["mveNDYcr9Bb1xjnNeCRumiDHKU3n3CJBuk"]}' http://blah:blah@127.0.0.1:7777
{"result": null, "id": "curltext", "error": {"code": -32601, "message": "Method getbalance not supported."}}

También probé sin especificar la dirección de bitcoin con los mismos resultados.

https://bitcointalk.org/index.php?topic=1894185.0 analiza el mismo problema y afirma isnt giving an error about the wallet being loaded, which is why I am getting the error above. Suponiendo que el cartel no significa "no es" sino "es", ¿cómo "descargaría la billetera"?

nota: mveNDYcr9Bb1xjnNeCRumiDHKU3n3CJBukes una dirección en la billetera de electrum

intente obtener el saldo de la dirección. también electrum helpen la línea de comando en un sistema Linux le mostrará algunos documentos.

Respuestas (2)

Resulta que electrum no tiene que estar en modo daemon para recibir solicitudes de API, pero tiene que estar en modo daemon antes de admitirlas.

Bien, entonces esto es difícil. Primero debe configurar su archivo de "configuración" de Electrum (no tiene una extensión) para asegurarse de que pueda conectarse. No puedes usar el mío porque no funcionará, pero este es un ejemplo mío. Debe agregar "rpcport": XXXXX, con el puerto que desee, asegúrese de no estropear el "," después de cada comentario o Electrum sobrescribirá su archivo.

{

"auto_connect": true,
"config_version": 2,
"console-history": [],
"enable_opreturn": false,
"fee_per_kb": 1000,
"gui_last_wallet": "c:\\users\\xxx\\appdata\\roaming\\electroncash\\wallets\\default_wallet",
"is_maximized": false,
"recently_open": [
    "c:\\users\\xxx\\appdata\\roaming\\electroncash\\wallets\\default_wallet"
],
"rpcpassword": "5555555555555555==",
"rpcport": 54777,
"rpcuser": "user"

}

Después de reiniciar Electrum e iniciar sesión con su contraseña, ahora puede conectarse con el código a continuación. Sin embargo, hay algunos problemas. Primero, Electrum requiere una ruta de billetera, pero no puede especificar la ruta de la billetera usando código. Este es un problema con Linux. Creo que no agregaron esta funcionalidad a Windows. Entonces, la única forma en que puede asegurarse de que su billetera esté cargada es mediante el archivo de configuración anterior, donde dice "recently_open" que tiene que apuntar a la billetera que desea usar. Si abre la aplicación Electrum de Windows y cambia de billetera por algún motivo y luego intenta usar este código a continuación, no funcionará. Lo cual es estúpido, pero es por eso que la gente está teniendo tantos problemas con esto.

Hay una variable que puede especificar en "parámetros" que es wallet_path, pero si intenta usarla, no funcionará, lo cual es absolutamente estúpido, simplemente falla, así que no se moleste.

Gracias a esta publicación: https://github.com/spesmilo/electrum/issues/5124 Pude hacer que la mía funcionara, pero como dije, wallet_path no funciona, es por eso que esas personas todavía tenían problemas.

En este ejemplo, estoy usando "getunusedaddress" en lugar de obtener el saldo de la billetera, pero ambos son recursos protegidos, por lo que puede cambiar entre ellos.

import java.util.Base64;
import java.io.*;
import java.net.*;
import java.net.HttpURLConnection;


public class daemon_test {



    public static void main(String[] args) {

        String s1 = new String("default_wallet");

        //Set password 

        connect_daemon("{\"id\":\"myquery\",\"method\":\"daemon\",\"params\":{\"config_options\":{\"subcommand\":\"load_wallet\", \"password\":\"susdoimsa;df\"}}}");
        connect_daemon("{\"id\":\"myquery\",\"method\":\"help\"}");
        connect_daemon("{\"id\":\"myquery\",\"method\":\"getunusedaddress\"}");


    }



    public static String connect_daemon(String url_prams) {

        String responseh = new String("");

        try {

            String url = "http://127.0.0.1:54777";//<<<<<<<<<<< set the PORT you are using
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setReadTimeout(30000);

            //SET USER NAME >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            String encoding = Base64.getEncoder().encodeToString("user:5555555555555555==".getBytes());

            //add reuqest header
            con.setRequestMethod("POST");
            con.setRequestProperty("Authorization", "Basic " + encoding);
            //con.setRequestProperty("method", "Basic " + encoding);

            String urlParameters = url_prams;//command=returnTradeHistory

            // Send post request
            con.setDoOutput(true);
            DataOutputStream wr = new DataOutputStream(con.getOutputStream());
            wr.writeBytes(urlParameters);
            wr.flush();
            wr.close();

            int responseCode = con.getResponseCode();
            //System.out.println("\nSending 'POST' request to URL : " + url);
            //System.out.println("Post parameters : " + urlParameters);
            //System.out.println("Response Code : " + responseCode);

            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            //BufferedReader in = new BufferedReader(new InputStreamReader(con.getErrorStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            //print result
            System.out.println(response.toString());
            responseh = response.toString();

        }catch(Exception e){

            e.printStackTrace();
            responseh = e.getMessage();

        }//*****************

        return responseh;

    }

}

Esta es la salida:

{"result": "qp0c59uccxftskajs5fxy2q7wn4cd03s9qzhlqfh4r", "id": "myquery","error": null}