Estoy tratando de hacer algo simple como Hello World que se muestra en una página web. He escrito un contrato inteligente como este:
pragma solidity ^0.4.18;
contract HelloContract {
string word = "Hello World!";
function getWord() constant returns (string) {
return word;
}
function setWord(string newWord) returns (string) {
word = newWord;
return word;
}
}
y este el html:
<html>
<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>Document</title>
<link rel="stylesheet" type="text/css" href="main.css">
<script src="./node_modules/web3/dist/web3.min.js"></script>
</head>
<body>
<div class="container">
<center>
<label for="name" class="col-lg-2 control-label">Name:</label>
<input id="name" type="text">
<button id="button">Click!</button>
<h1 id="word"></h1>
</center>
</div>
<script src="https://code.jquery.com/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 the Web3.providers
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
web3.eth.defaultAccount = web3.eth.accounts[0];
var HelloContract = web3.eth.contract([
{
"constant": false,
"inputs": [
{
"name": "newWord",
"type": "string"
}
],
"name": "setWord",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "Word",
"type": "string"
}
],
"name": "Word",
"type": "event"
},
{
"constant": true,
"inputs": [],
"name": "getWord",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]);
var Hello = HelloContract.at('0xd993de41f4979af7af48c2b5262afb41e63ff4c6');
Hello.getWord(function(error, result){
if(!error)
{
$("#word").html('Hello ' + result[0]);
} else
console.log(error);
});
$("#button").click(function() {
Hello.setWord($("#name").val());
});
</script>
</body>
</html>
lo que estoy tratando de hacer es que los usuarios inserten su nombre (setWord) y mostrará "Hola (nombre de usuario)" (getWord) y todo esto que se ejecuta en blockchain significa que hay un txhash y cuando hago clic en él se mostrará "Hola (usuario)" en los datos de etherscan.
Al llamar a la función setWord, debe especificar el límite de gas (costo de transacción que puede gastar para ejecutar) esa transacción y cuenta en particular de la cual se debe deducir ese costo de transacción en particular.
Hello.setWord($("#name").val(),{from: web3.eth.accounts[0], gas:3000000});
Como está especificando web3.eth.defaultAccount = web3.eth.accounts[0];
que es la cuenta predeterminada desde la cual se ejecutarán todas las transacciones, no es necesario especificar, from: web3.eth.accounts[0]
pero debe mencionar el límite de gas.
Después de hacer esto, podrá ejecutar setWord()
transacciones getWord()
con éxito. Me pregunto por qué está imprimiendo solo la primera letra ( result[0]
) en getWord()
función. Deberá imprimir el resultado completo, es decir result
.
Adjunto aquí el código completo que puedo ejecutar. Debe actualizar la página para ver la palabra modificada.
<html>
<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>Document</title>
<!-- <link rel="stylesheet" type="text/css" href="main.css"> -->
<!-- <script src="./node_modules/web3/dist/web3.min.js"></script> -->
</head>
<body>
<div class="container">
<center>
<label for="name" class="col-lg-2 control-label">Name:</label>
<input id="name" type="text">
<button id="button">Click!</button>
<h1 id="word"></h1>
</center>
</div>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdn.rawgit.com/ethereum/web3.js/develop/dist/web3.js"></script>
<script>
Web3 = require('web3');
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));
web3.eth.defaultAccount = web3.eth.accounts[0];
var HelloContract = web3.eth.contract([
{
"constant": false,
"inputs": [
{
"name": "newWord",
"type": "string"
}
],
"name": "setWord",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "Word",
"type": "string"
}
],
"name": "Word",
"type": "event"
},
{
"constant": true,
"inputs": [],
"name": "getWord",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]);
var Hello = HelloContract.at('0x178cae4d338a7c3ea5fcf8727bac04b5df925607');
Hello.getWord(function(error, result){
if(!error)
{
$("#word").html('Hello ' + result);
} else
console.log(error);
});
console.log("Word :"+$("#name").val());
$("#button").click(function() {
Hello.setWord($("#name").val(),{from: web3.eth.accounts[0], gas:3000000});
});
</script>
</body>
ismael
Naim Roslan