Obtenga el saldo del token de contrato inteligente a través de JSON RPC

A través de la línea de comandos de Geth, puedo obtener el saldo de mi token de contrato inteligente con:

var mytest = eth.contract([{interface}]).at(contract address);
mytest.balanceOf(eth.accounts[0])
>998

Quiero presentar el saldo de tokens en mi sitio web. ¿Cómo puedo hacer eso?

Probé JSON-RPC y varios métodos como eth_getTransactionByHash, pero no puedo averiguar cómo obtener el saldo.

Respuestas (2)

Utilice web3.js para presentar el saldo en su sitio web.

La consola de Geth, donde pudo obtener el saldo del token, es Javascript y usa web3.js bajo el capó, por lo que el código de su sitio web será casi idéntico.

De lo contrario, con JSON-RPC debe usar eth_cally debe codificar ABI la función que está llamando y sus parámetros. Es mucho más complicado, para ver un ejemplo, consulte: Cómo llamar a un método de contrato usando la API eth_call JSON-RPC


Si se desea la representación del lado del servidor, esa decisión de diseño podría examinarse porque un usuario debería poder ejecutar una aplicación descentralizada sin un servidor: Swarm e IPFS son tecnologías a tener en cuenta como la dirección que probablemente tomarán las DApps.

Ahora aparece un error: TypeError no detectado: MyContract.at no es una función. Con estos detalles: var MyContract = eth.contract([{interfaz}]). Y: var tokens = MyContract.at("MyAddress").balanceOf(eth.accounts[0]); consola.log(tokens);
Si no puede detectar lo que está mal, publicar más detalles en una pregunta separada puede ayudar a las personas a detectarlo.
Use web.eth.contract (interfaz) y también probablemente necesite usar JSON.parse (abi).

Agregando a la respuesta de @eth♦ y al comentario de @Jeroen

Obtenga saldo de token de contrato inteligente con web3 1.0.0-beta.31

En 1.0.0-beta... la mayoría se maneja a través de Promises ahora, por lo tanto, podría hacer:

var mytest = new web3.eth.Contract({interface}, '0x123....', {
    from: '0x456...', // default from address
    gasPrice: '20000000000' // default gas price in wei, 20 gwei in this case
});

mytest.methods.balanceOf('0x456...').call()
    .then(function(result){
    //the result holds your Token Balance that you can assign to a var
    var myTokenBalance = result;
    return result;
});
  • ¿Dónde {interface}está el ABI de su contrato 0x123....?
  • ¿Dónde 0x123....está la dirección de su contrato?
  • ¿Dónde 0x456....está la dirección de su cuenta Ethereum que contiene los tokens (es decir, la cuenta ETH de la que desea recuperar su saldo de tokens)

No olvides agregar el newantesweb3.eth.Contract(....)

@Jeroen De esa manera no obtendrás el error

MyContract.at no es una función

más.

Nota: estoy usando el proveedor de IPC geth.ipc para interactuar con mi nodo (ya que estoy en la misma PC, localhost, por lo tanto, guardo más en lugar de usar la solicitud HTTP).

  if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
  } else {
    var net = require('net');
    var web3 = new Web3('/home/yourHomeFolder/.ethereum/geth.ipc', net);
  };

Editar: como referencia siguiendo el ABI JSON ( web3.eth.Contract({interface}) que estoy usando para mi contrato inteligente, siendo myContractABImi {interface}:

    myContractABI = [
    {
        "constant": false,
        "inputs": [
            {
                "name": "newSellPrice",
                "type": "uint256"
            },
            {
                "name": "newBuyPrice",
                "type": "uint256"
            }
        ],
        "name": "setPrices",
        "outputs": [],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "name",
        "outputs": [
            {
                "name": "",
                "type": "string"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "_spender",
                "type": "address"
            },
            {
                "name": "_value",
                "type": "uint256"
            }
        ],
        "name": "approve",
        "outputs": [
            {
                "name": "success",
                "type": "bool"
            }
        ],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "totalSupply",
        "outputs": [
            {
                "name": "",
                "type": "uint256"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "_from",
                "type": "address"
            },
            {
                "name": "_to",
                "type": "address"
            },
            {
                "name": "_value",
                "type": "uint256"
            }
        ],
        "name": "transferFrom",
        "outputs": [
            {
                "name": "success",
                "type": "bool"
            }
        ],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "decimals",
        "outputs": [
            {
                "name": "",
                "type": "uint8"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "_value",
                "type": "uint256"
            }
        ],
        "name": "burn",
        "outputs": [
            {
                "name": "success",
                "type": "bool"
            }
        ],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "sellPrice",
        "outputs": [
            {
                "name": "",
                "type": "uint256"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [
            {
                "name": "",
                "type": "address"
            }
        ],
        "name": "balanceOf",
        "outputs": [
            {
                "name": "",
                "type": "uint256"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "target",
                "type": "address"
            },
            {
                "name": "mintedAmount",
                "type": "uint256"
            }
        ],
        "name": "mintToken",
        "outputs": [],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "_from",
                "type": "address"
            },
            {
                "name": "_value",
                "type": "uint256"
            }
        ],
        "name": "burnFrom",
        "outputs": [
            {
                "name": "success",
                "type": "bool"
            }
        ],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "buyPrice",
        "outputs": [
            {
                "name": "",
                "type": "uint256"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "owner",
        "outputs": [
            {
                "name": "",
                "type": "address"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "symbol",
        "outputs": [
            {
                "name": "",
                "type": "string"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [],
        "name": "buy",
        "outputs": [],
        "payable": true,
        "stateMutability": "payable",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "_to",
                "type": "address"
            },
            {
                "name": "_value",
                "type": "uint256"
            }
        ],
        "name": "transfer",
        "outputs": [],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [
            {
                "name": "",
                "type": "address"
            }
        ],
        "name": "frozenAccount",
        "outputs": [
            {
                "name": "",
                "type": "bool"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "_spender",
                "type": "address"
            },
            {
                "name": "_value",
                "type": "uint256"
            },
            {
                "name": "_extraData",
                "type": "bytes"
            }
        ],
        "name": "approveAndCall",
        "outputs": [
            {
                "name": "success",
                "type": "bool"
            }
        ],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [
            {
                "name": "",
                "type": "address"
            },
            {
                "name": "",
                "type": "address"
            }
        ],
        "name": "allowance",
        "outputs": [
            {
                "name": "",
                "type": "uint256"
            }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "amount",
                "type": "uint256"
            }
        ],
        "name": "sell",
        "outputs": [],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "target",
                "type": "address"
            },
            {
                "name": "freeze",
                "type": "bool"
            }
        ],
        "name": "freezeAccount",
        "outputs": [],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
            {
                "name": "newOwner",
                "type": "address"
            }
        ],
        "name": "transferOwnership",
        "outputs": [],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "inputs": [
            {
                "name": "initialSupply",
                "type": "uint256"
            },
            {
                "name": "tokenName",
                "type": "string"
            },
            {
                "name": "tokenSymbol",
                "type": "string"
            }
        ],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "constructor"
    },
    {
        "anonymous": false,
        "inputs": [
            {
                "indexed": false,
                "name": "target",
                "type": "address"
            },
            {
                "indexed": false,
                "name": "frozen",
                "type": "bool"
            }
        ],
        "name": "FrozenFunds",
        "type": "event"
    },
    {
        "anonymous": false,
        "inputs": [
            {
                "indexed": true,
                "name": "from",
                "type": "address"
            },
            {
                "indexed": true,
                "name": "to",
                "type": "address"
            },
            {
                "indexed": false,
                "name": "value",
                "type": "uint256"
            }
        ],
        "name": "Transfer",
        "type": "event"
    },
    {
        "anonymous": false,
        "inputs": [
            {
                "indexed": true,
                "name": "from",
                "type": "address"
            },
            {
                "indexed": false,
                "name": "value",
                "type": "uint256"
            }
        ],
        "name": "Burn",
        "type": "event"
    }
];
Estaba buscando esta respuesta hace 2 días) triste, apareció hace solo 14 horas, pero es una respuesta realmente útil . En realidad, mi solución se parece en un 99 % a la tuya.
¿Cómo puedo obtener el ABI para {interfaz}-parámetro? Desplegué mi contrato con la trufa.
Estoy tratando de lograr esto en C#. ¿Puedo ver el Json para esto? No puedo resolverlo sin ver lo que se supone que debo poner en el cuerpo POST.
@MelbourneDeveloper He agregado JSON de mi contrato inteligente; espero que eso sea lo que estabas pidiendo.
Necesito documentación sobre cómo verificar qué tokens están en una dirección y cuál es el saldo. Web3 no me va a ayudar porque uso C#.