0

我一直在尝试创建一个智能合约/代币,将其部署在币安智能链测试网上。我遵循了一些文档并从这个开始。我正在研究这个功能问题。函数被声明为只读。这是源代码

该函数正在更改所有者地址的状态,将其声明为只读的其他选项是什么


// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.2;

//import "Context.sol";
//import "IBEP20.sol";
//import "SafeMath.sol";
//import "Ownable.sol";

contract SampleTaken {
    
    
    mapping(address => uint) public balances;
    
    uint public totalSupply = 1000000 * 10 ** 18;
    string public name ="Sample Token";
    string public symbol ="KJA";
    uint public decimals = 18;
    
    /** Events aailable for the Contract**/
    
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    
    constructor(){
        balances[msg.sender] = totalSupply;
    }
    
    function balanceOf(address _ownerAddress) public view returns (uint){
        return balances[_ownerAddress];
    }
    
    function transfer(address _toAddress, uint _noOfTokens) public view returns (bool){
    require(balanceOf(msg.sender) >= _noOfTokens, "Total balance is less than the number of Tokens asked for !!!");
    balances[_toAddress] +=_noOfTokens;
    balances[msg.sender] -= _noOfTokens;
    emit Transfer(msg.sender,_toAddress, _noOfTokens);
    return true;
    }
    
    function transferFrom(address _from, address _to, uint _value) public returns (bool){
     require(balanceOf(_from) >= _value, "Balance is less than the number of Tokens asked for !!!");
    // require(allowance[_from][msg.sender] >= _value, "Allowance too low");
     balances[_to] += _value;
     balances[_from] -= _value;   
     
     emit Transfer (_from, _to, _value);
     return true;
     
     }    
}

任何帮助深表感谢。

问候

4

2 回答 2

2

您的transfer()函数被声明为view函数。

函数可以声明为视图,在这种情况下它们承诺不修改状态。

资料来源:Solidity 文档

但是这些行(在transfer()函数内)修改了状态:

balances[_toAddress] +=_noOfTokens;
balances[msg.sender] -= _noOfTokens;
emit Transfer(msg.sender,_toAddress, _noOfTokens);

如果您希望您的函数修改状态,它不能是view(也不是pure)函数 - 您需要删除view修饰符:

function transfer(address _toAddress, uint _noOfTokens) public returns (bool){
于 2021-05-10T08:51:08.223 回答
1

从函数声明中删除vieworpure关键字并仅保留public returns

改变

function transfer(address _toAddress, uint _noOfTokens) public view returns (bool)

function transfer(address _toAddress, uint _noOfTokens) public returns (bool)

改变方法:

function transfer(address _toAddress, uint _noOfTokens) public returns (bool){
    require(balanceOf(msg.sender) >= _noOfTokens, "Total balance is less than the number of Tokens asked for !!!");
    balances[_toAddress] +=_noOfTokens;
    balances[msg.sender] -= _noOfTokens;
    emit Transfer(msg.sender,_toAddress, _noOfTokens);
    return true;
    }
    
于 2022-01-06T13:47:22.650 回答