Desarrollé un contrato de la siguiente manera y obtuve "certificado de garantía". Significa que funciona bien. Ahora quiero diseñar una aplicación web como interfaz de usuario para interactuar con un contrato inteligente. Lo hice con HTML y JavaScript. Sin embargo, no funciona correctamente. ¿Puedes mencionar qué parte de html o JavaScript está mal? (Necesito configurar y obtener los valores de "energía" y "potencia").
Código de contrato inteligente:
pragma solidity ^0.4.15;
import './Ownable.sol';
contract Weechain is Ownable{
using SafeMath for uint256;
uint256 public energyTotalSupply;
uint256 public powerTotalSupply;
struct Device {
uint256 energyValue;
uint256 powerValue;
}
mapping(address => Device) amount;
event setEnergyEvent(address indexed device, uint256 energy);
event setPowerEvent(address indexed device, uint256 power);
event setPayloadEvent(uint256 indexed SQN, string payload);
// Constructor
function Weechain() {
energyTotalSupply = 0;
powerTotalSupply = 0;
amount[owner].energyValue = energyTotalSupply;
amount[owner].powerValue = powerTotalSupply;
}
function amountOfenergy(address dev) constant returns (uint256 energy) {
return amount[dev].energyValue;
}
function amountOfpower(address dev) constant returns (uint256 power) {
return amount[dev].powerValue;
}
function setPayload(uint256 SQN, string payload) public returns (bool) {
emit setPayloadEvent(SQN, payload);
return true;
}
function setEnergy(address dev, uint256 energy) public returns (bool) {
require(dev != address(0));
amount[dev].energyValue = amount[dev].energyValue + energy;
energyTotalSupply = energyTotalSupply + energy;
emit setEnergyEvent(dev, energy);
return true;
}
function setPower(address dev, uint256 power) public returns (bool) {
require(dev != address(0));
amount[dev].powerValue = amount[dev].powerValue + power;
powerTotalSupply = powerTotalSupply + power;
emit setPowerEvent(dev, power);
return true;
}
}
Mi código HTML y JavaScript:
<!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>Weechain Smart Contract</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">
<h1>Weechain Instructor</h1>
<p>Output: <span id="owner"></span>
</p>
<h2 id="instructor"></h2>
<label for="name" class="col-lg-2 control-label">Address</label>
<input id="Address" type="text"> <!--name will be changed to device address-->
<label for="name" class="col-lg-2 control-label">Energy</label>
<input id="Energy" type="text"> <!--age will be changed to energy value type = "text" will be type = "number"-->
<button id="buttonSet">Set</button>
<button id="buttonGet">Get</button>
</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 {
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
web3.eth.defaultAccount = web3.eth.accounts[0];
/*
var CoursetroContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"_fName","type":"string"},{"name":"_age","type":"uint256"}],"name":"setInstructor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInstructor","outputs":[{"name":"","type":"string"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]);
*/
var CoursetroContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"energyTotalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"dev","type":"address"}],"name":"amountOfenergy","outputs":[{"name":"energy","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":"powerTotalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"dev","type":"address"},{"name":"energy","type":"uint256"}],"name":"setEnergy","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"SQN","type":"uint256"},{"name":"payload","type":"string"}],"name":"setPayload","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"dev","type":"address"}],"name":"amountOfpower","outputs":[{"name":"power","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"dev","type":"address"},{"name":"power","type":"uint256"}],"name":"setPower","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"device","type":"address"},{"indexed":false,"name":"energy","type":"uint256"}],"name":"setEnergyEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"device","type":"address"},{"indexed":false,"name":"power","type":"uint256"}],"name":"setPowerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"SQN","type":"uint256"},{"indexed":false,"name":"payload","type":"string"}],"name":"setPayloadEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_by","type":"address"},{"indexed":true,"name":"_to","type":"address"}],"name":"ChangementOwnership","type":"event"}]);
var Coursetro = CoursetroContract.at('0x9ea9de4056ae3defda58ca02257e7b6218f2e6eb');
$("#buttonGet").click(function() {
Coursetro.amountOfenergy('0xbacbc6e824272c7c501d930d8bb2a9e4d1a80312', function(error, result) {
if (!error) {
$("#instructor").html(result[0])+' ('+result[1]+')');
console.log(result);
} else
console.log(error);
});
});
$("#buttonSet").click(function() {
//Coursetro.setPayload($("#name").val(), $("#age").val());
Coursetro.setEnergy($("#Address").val(), $("#Energy").val());
//Coursetro.setPayload($("#name").val());
});
</script>
</body>
</html>
NOTA: También he creado un repositorio de Github para este proyecto que incluye código de contrato inteligente, HTML y JavaScript AQUÍ: https://github.com/s1241/GUI-for-Smart-Contract
No tengo 50 reputación para hacer una pregunta de comentario, pero supongo que el problema con el que te encuentras es porque tus setters deben ser promesas y requieren una .then(function(response, error) {})
cadena.
Por lo tanto, no está esperando que regrese la respuesta e inmediatamente tratando de obtener los valores (que no se establecerán).
Este sitio podría ayudar: https://coursetro.com/posts/code/99/Interacting-with-a-Smart-Contract-through-Web3.js-(Tutorial)
Promesas: https://developers.google.com/web/fundamentals/primers/promises
Preguntador
dany
Preguntador
dany
Preguntador
dany
dany
address dev
Preguntador
dany
Preguntador
Preguntador
dany
Preguntador
dany
Anupam