GUI не работает по контракту

Я составил договор следующим образом и получил "гарантийный сертификат". Это означает, что он работает хорошо. Теперь я хочу разработать веб-приложение как пользовательский интерфейс для взаимодействия со смарт-контрактом. Я сделал это с помощью 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 .

Ответы (1)

У меня нет репутации 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

Спасибо, но я использовал именно этот код учебника для разработки своего приложения HTML и Javascript. И я вызываю свои функции, как этот учебник. Вы можете увидеть мой код. Если вы думаете, что что-то не так, пожалуйста, дайте мне знать.
Да, проблема в том, что вы устанавливаете и сразу получаете после. Вам нужно установить его, затем дождаться подтверждения транзакции, чтобы она была записана в сеть ethereum, а затем получить изменения после подтверждения транзакции. Создайте две кнопки, одну для настройки и другую для получения. Нажмите «Получить» после того, как ваша транзакция будет подтверждена и добыта.
Спасибо. На самом деле, я создал две кнопки установки (установка энергии и установка мощности), но я не знаю, как создать для получения такое, чтобы после нажатия перенастроенное значение моей функции отображалось в текстовом поле. Вы знаете, как это сделать? Спасибо.
Да, вам нужно либо получить доступ к общедоступной переменной в вашем контракте, либо создать getFunction, чтобы получить все, что вам нужно. См. учебник выше? У них есть функция в их контракте function getInstructor() view public return (string, uint) { return (fName, age); }
Да я видел. но в его html и javascript нет «кнопки» для вызова функции getInstructor(). См. конец моего кода javascript (Weechain.amountOfenergy(функция(ошибка, результат) ....), где я сделал точно так же, как в этом руководстве. не так ли?
Ага, понятно. Да, так что установите создать кнопку, чтобы получить количество энергии. Что-то вроде этого Значение: 'result[0]); } else console.log(ошибка); }); });
Вам также нужно передать адрес в суммуOfEnergy, так как вы установили его наaddress dev
Я изменил свой код html и javascript, как вы сказали, и обновил свой вопрос. Однако пока это не работает. Не могли бы вы сказать мне ваше мнение. Если вы можете проверить это, это прекрасно. Спасибо
Можешь сделать репозиторий на гитхабе?
Сур, я собираюсь это сделать.
Я создал репозиторий Github для этого проекта. Если вам нужны другие дела, пожалуйста, дайте мне знать. Спасибо. github.com/s1241/GUI-для-смарт-контракта
вам нужно импортировать ваш контракт, не так ли? im получение Weechan не определено. не могли бы вы обновить репозиторий, чтобы он правильно импортировал файлы, прежде чем я снова взгляну на него
Я снова загрузил контракт Weechain и другие файлы (index.html и т. д.) в репозиторий github.com/s1241/GUI-for-Smart-Contract . Также для получения более подробной информации вы можете посмотреть ссылку1 и ссылку2. Если вы считаете, что есть какие-либо другие проблемы, сообщите мне об этом. Спасибо.
Похоже, ты разобрался. Хорошая работа
@Danny Теперь у тебя 50. Помогите сообществу расти.