Я составил договор следующим образом и получил "гарантийный сертификат". Это означает, что он работает хорошо. Теперь я хочу разработать веб-приложение как пользовательский интерфейс для взаимодействия со смарт-контрактом. Я сделал это с помощью HTML и JavaScript. Однако это не работает должным образом. Можете ли вы упомянуть, какая часть html или JavaScript неверна? (Мне нужно установить и получить значения «энергии» и «мощности».)
Код смарт-контракта:
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;
}
}
Мой код HTML и 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>
ПРИМЕЧАНИЕ. Я также создал репозиторий Github для этого проекта, включая смарт-контракт, код HTML и JavaScript ЗДЕСЬ: https://github.com/s1241/GUI-for-Smart-Contract .
У меня нет репутации 50, чтобы задать вопрос в комментарии, но я предполагаю, что проблема, с которой вы столкнулись, заключается в том, что ваши сеттеры должны быть обещаниями и требуют .then(function(response, error) {})
цепочки.
Таким образом, вы не ждете ответа и сразу же пытаетесь получить значения (которые не будут установлены).
Этот сайт может помочь: https://coursetro.com/posts/code/99/Interacting-with-a-Smart-Contract-through-Web3.js-(Tutorial)
Обещания: https://developers.google.com/web/fundamentals/primers/promises
Спрашивающий
Дэнни
Спрашивающий
Дэнни
Спрашивающий
Дэнни
Дэнни
address dev
Спрашивающий
Дэнни
Спрашивающий
Спрашивающий
Дэнни
Спрашивающий
Дэнни
Анупам