Ethereum Solidity:TypeError:函数声明为视图,但此表达式修改状态,因此需要非应付(默认)或应付

Ethereum Solidity:TypeError:函数声明为视图,但此表达式修改状态,因此需要非应付(默认)或应付,ethereum,solidity,bep20,Ethereum,Solidity,Bep20,我一直在尝试创建一个智能合约/令牌,将在Binance智能链测试网上部署它。我遵循了一些文档,从这里开始。我正在讨论这个函数问题。函数声明为只读。这是源代码 该函数正在更改所有者地址的状态,将其声明为只读的其他选项是什么 非常感谢您的帮助 将您的transfer()函数声明为视图函数 函数可以声明为视图,在这种情况下,它们承诺不修改状态 资料来源: 但是这些行(在transfer()函数中)修改了状态: balances[_toAddress] +=_noOfTokens; balances[

我一直在尝试创建一个智能合约/令牌,将在Binance智能链测试网上部署它。我遵循了一些文档,从这里开始。我正在讨论这个函数问题。函数声明为只读。这是源代码

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


非常感谢您的帮助

将您的
transfer()
函数声明为
视图
函数

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

资料来源:

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

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

如果希望函数修改状态,则它不能是
视图
(也不能是
)函数-并且需要删除
视图
修改器:

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

谢谢你,彼得。浏览了文档,看起来视图在这种情况下无法使用。然而,根据我的理解,将函数声明为视图会使它们无法从合同外部访问,从而保护函数。我的理解不对吗?Thanks@user3161840“视图使他们无法从合同外部访问”-这是不正确的。。。如果要限制哪些地址可以执行该函数,可以使用该方法。OpenZeppelin实现仅针对一个地址(存储在
\u owner
属性中)进行验证,但您也可以针对多个地址(存储在数组或映射中)进行验证。。。如果您不希望任何其他合同或用户执行该功能,则需要将其标记为
private
internal
function transfer(address _toAddress, uint _noOfTokens) public returns (bool){