Red Ropsten: método 405 no permitido en eth_sendTransaction

Estoy tratando de acceder a mi contrato usando web3js y he proporcionado mi archivo html (con los detalles del contrato) aquí. Recibo 2 errores y probé métodos como desbloquear cuenta, configurar cuenta predeterminada, etc., y nada parece funcionar. La operación CURL devuelve el error 405. Cualquier sugerencia por favor.


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>HC</title>

    <link rel="stylesheet" type="text/css" href="./js/main.css">

    <script src="./js/web3.min.js"></script>

</head>
<body>
    <div class="container">

        <h1>HC Demo</h1>

        <h2 id="instructor"></h2>

        <label for="name" class="col-lg-2 control-label">Provider Name</label>
        <input id="name" type="text">

        <label for="name" class="col-lg-2 control-label">Account Type</label>
        <input id="type" type="text">

        <button id="button">Add provider</button>


    </div>

    <script src="./js/jquery-3.2.1.slim.min.js"></script>

    <script>

    if (typeof web3 !== 'undefined') {
        web3 = new Web3(web3.currentProvider);
    } else {
        // set the provider you want from Web3.providers
        web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/"));
    }

    web3.eth.defaultAccount = "0x44261BBDAB466E1950Ef173b595322B49F4DA5C5";
    console.log("Default account = " + web3.eth.defaultAccount );
    //web3.eth.defaultAccount = "0x44261BBDAB466E1950Ef173b595322B49F4DA5C5";
    //personal.unlockAccount(web3.eth.defaultAccount);
    var hcContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"subscribers","outputs":[{"name":"id","type":"uint256"},{"name":"name","type":"string"},{"name":"accountType","type":"string"},{"name":"accBalance","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"name","type":"string"},{"name":"accountType","type":"string"}],"name":"addProvider","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"accountType","type":"string"},{"indexed":false,"name":"accBalance","type":"uint16"}],"name":"eveSubscriber","type":"event"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"getAccountBalance","outputs":[{"name":"_accBal","type":"uint16"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"getProviderName","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_claimAmount","type":"uint16"}],"name":"submitClaim","outputs":[{"name":"status","type":"bool"},{"name":"_remainingBalance","type":"uint16"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]);
    //hcContract.web3.eth.defaultAccount="0x44261BBDAB466E1950Ef173b595322B49F4DA5C5";

    var Contract = hcContract.at('0x221e64f96560f97d8a06510da8a020484d5669eb');
    //hcContract.web3.eth.defaultAccount = "0x44261BBDAB466E1950Ef173b595322B49F4DA5C5";
    console.log(Contract);

    var event = Contract.eveSubscriber({},'latest');

    $("#button").click(function() {
        console.log($("#name").val(), $("#type").val());
        Contract.addProvider($("#name").val(), $("#type").val());
    });
    </script>
</body>
</html>


<!--


https://ropsten.etherscan.io/tx/0x5d16f717691d796a1ec901014981e2594ec8356a06cce25dca061abe65ae432a


pragma experimental ABIEncoderV2;
contract HealthCareDemo {

    //ERC20 standard 
    string public constant name = "HealthCare_v0.1";
    string public constant symbol = "HC";
    uint8 public constant decimals = 18;  // 18 is the most common number of decimal places
    address owner;

    function kill() { // returns (bool){
    //    if (msg.sender == owner)
            selfdestruct(owner);
    }
    struct SubscriberStruct {
        uint id;
        string name;
        string accountType;
        uint16 accBalance;

    }
    SubscriberStruct[] public subscribers;
//  mapping (address => SubscriberStruct[]) public subscribers;

    event eveSubscriber (
        uint id,
        string name,
        string accountType,
        uint16 accBalance
        );

    //Provider gets added and based on account type, balance is set
    function addProvider(string name, string accountType) returns (bool) {
        uint16 _accBal = 0;
        if(compareStrings(accountType,"HRA")) {
            _accBal = 500;
        }
        else if (compareStrings(accountType,"FSA")) {
            _accBal = 1000;
        }
        else {
            _accBal = 100;
        }

        SubscriberStruct memory s;
        s.name = name;
        s.accountType = accountType;
        s.id = subscribers.length;
        s.accBalance = _accBal;
        subscribers.push(s);

        //eveSubscriber(subscribers[id].id,subscribers[id].name,subscribers[id].accountType,subscribers[id].accBalance);
        eveSubscriber(s.id,s.name,s.accountType,s.accBalance);

        return true;
    }
    //https://github.com/ethereum/solidity/issues/2948 -- returning struct has issue
    function getProviderName(uint id) public returns (string _name) {
        return subscribers[id].name;
    }
    function getAccountBalance(uint id) public returns (uint16 _accBal) {
        return subscribers[id].accBalance;
    }

    function submitClaim(uint _id, uint16 _claimAmount) public returns (bool status, uint16 _remainingBalance) {
        if(subscribers[_id].accBalance >= _claimAmount) {
            subscribers[_id].accBalance -= _claimAmount;
            return (true, subscribers[_id].accBalance);
        }
        else {
            return (false, subscribers[_id].accBalance);
        }
    }

    function compareStrings (string a, string b) view private returns (bool){
       return keccak256(a) == keccak256(b);
   }

}


-->

Errores en el navegador Brave -

Error #1: al cargar la página

Código de estado: 405 Método no permitido

Request Payload: {"jsonrpc":"2.0","id":1,"method":"eth_newFilter","params":[{"topics":["0x6988b3af4053aeb8a7e14aad74b7539182c310204e73eabe35b5aa92938f6db5"],"address":"0x221e64f96560f97d8a06510da8a020484d5669eb"} ]}

Error #2: al hacer clic en 'Agregar proveedor'

Código de estado: 405 Método no permitido

Request Payload: {"jsonrpc":"2.0","id":2,"method":"eth_sendTransaction","params":[{"to":"0x221e64f96560f97d8a06510da8a020484d5669eb","data":"0x705258340000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000024d4b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034653410000000000000000000000000000000000000000000000000000000000","from ":"0x44261BBDAB466E1950Ef173b595322B49F4DA5C5"}]}

Respuestas (2)

Supongo que la rama que se sigue es la que usa Infura como proveedor.

Infura no puede desbloquear cuentas ni firmar transacciones porque no conoce sus claves privadas. El mensaje de error es para indicar que los métodos a los que llama no son compatibles.

Entonces, ¿qué sucursal puedo usar además de infura que me permita desbloquear mi cuenta?
La otra rama de la ifdeclaración intenta usar un proveedor web3 inyectado. MetaMask es el proveedor web3 más utilizado y permitirá que el usuario de su aplicación use cualquier cuenta que haya configurado con MetaMask.
Perdón por la pregunta coja aquí. Mi código html llama a web3 = new Web3(new Web3.providers.HttpProvider(" ropsten.infura.io/" )); lo que básicamente significa que me conecto a la red ropsten. De hecho, puedo 'leer' los datos del contrato, pero cuando intento escribir, tengo un problema.
¿Hay algo en mi respuesta que no entendiste?
Lo que dijiste sobre metamask y web3 inyectado está bien. De hecho, mi código conecta ropsten infura. Ahora la pregunta es, si infura no puede desbloquear cuentas/firmar transacciones, ¿hay un entorno alternativo (prueba pública) que lo haga? Como, ¿podrán kovan/rinkeby desbloquear cuentas?
No tiene sentido que un nodo público contenga sus claves privadas. Si desbloqueaste una cuenta en un nodo público, alguien más conectado a ese nodo podría robar todo tu ether.

Gracias a @smarx, ahora lo entiendo.

Entonces, la respuesta a lo que sea que quería hacer es,

  • Crear una cuenta con infura - donde obtendré un token de acceso único
  • Configure un nodo local para que se conecte a la red ropsten
  • Escriba una página html que tenga su URL de token de acceso único en línea: Web3.providers.HttpProvider

Ahora, esto me permitirá acceder a mi contrato que está implementado en infura.