Переменная состояния контракта не может быть обновлена ​​через JavaScript - PullRequest
1 голос
/ 06 ноября 2019

У меня следующий контракт, и я просто хочу обновить его значения переменных состояния, т.е. totalSupply. Но когда я пытаюсь выполнить эту задачу через код JavaScript (приведенный ниже), вызывая его функцию, т.е. setTotalSupply, значения tts не обновляются.

pragma solidity 0.5.1;

contract MyContract {

    uint256 totalSupply; 
    mapping(address => uint256) public balances;
    address owner;

    constructor(address payable _wallet) public {
        totalSupply = 10;
        owner = _wallet;
    }

    function () external payable{
        buyToken();
    }

    function buyToken() public payable {
        require(totalSupply >= (msg.value/1000000000000000000)*2);
        balances[msg.sender] += (msg.value/1000000000000000000)*2;
        // wallet.tranfer(msg.value);
        totalSupply -=(msg.value/1000000000000000000)*2;

    }
    function getTotalSupply()public view returns  (uint256 ){
        return totalSupply;
    }
       function setTotalSupply(uint256 newSupply)public {
        require(msg.sender == owner && totalSupply<1);
        totalSupply = newSupply;

    }
    function getBalance() public view returns  (uint) {
        return address(this).balance;
    }

}

Я просто хочу обновить его значение, т.е. общее предложение. ниже мой код JavaScript для вышеуказанной цели

var Tx = require('ethereumjs-tx').Transaction
const Web3 = require('web3');
const provider = new Web3.providers.HttpProvider("https://ropsten.infura.io/v3/7fb0bdc97c.....");
 const web3 = new Web3(provider);

var contract1  = new web3.eth.Contract(contractABI, contractAddress1)
const txData2 = contract1.methods.setTotalSupply(10).encodeABI(); 
setSupplyBalance(contractAddress1, txData2);

function setSupplyBalance(contractAddress, txData ){

web3.eth.getTransactionCount(account1, (err, txCount) => {
      txObject = {
      nonce:    web3.utils.toHex(txCount),
      gasLimit: web3.utils.toHex(1000000),
      gasPrice: web3.utils.toHex(web3.utils.toWei('100', 'gwei')),
      to: contractAddress,
      value: web3.utils.toHex(web3.utils.toWei('0', 'ether')),
      data:txData
    }




  const tx = new Tx(txObject, {chain:'ropsten', hardfork: 'petersburg'})
// sign the trx
tx.sign(privateKey1)

serializedTx = tx.serialize()

raw = '0x' + serializedTx.toString('hex')

  web3.eth.sendSignedTransaction (raw, (err, txHash)=> {
    console.log('err:', err)
    console.log('txHash', txHash)
  })

  })

}

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

ОБНОВЛЕНИЕ

Я думаю, что нашел причину. Вы не указали переменную _wallet в правильном адресе конструктора при развертывании контракта, поэтому она не передаст оператор require в setTotalSupply.


равно ли totalSupply 0 при вызове setTotalSupply?

Поскольку в setTotalSupply есть оператор require, если он не равен 0, транзакция будет отменена, а значение totalSupply не будет обновлено.

0 голосов
/ 07 ноября 2019

делает payable totalSupply и функцию setTotalSupply, затем сделанный trx со значением ноль решит эту ошибку ...

...