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.
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_call
y 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.
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;
});
{interface}
está el ABI de su contrato 0x123....
?0x123....
está la dirección de su contrato?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 new
antesweb3.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 myContractABI
mi {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"
}
];
LF00