Solidity Error :: ParserError: Expected '(' but got 'public'

Solidity Error :: ParserError: Expected '(' but got 'public'

我一直收到这个错误......

"from solidity:
ParserError: Expected '(' but got 'public'
 --> contracts/3_Ballot.sol:6:24:
  |
6 |     function PiggyBank public()
  |                        ^^^^^^", 

怎么办?

    pragma solidity ^0.8.0;
    contract PiggyBank{
    address creator;
    uint deposits;

    function PiggyBank public()          \error in this line
    {
        creator=msg.sendor;
        deposits=0;
    }

    function deposit() payable returns(uint)
    {
        if(msg.value>0)
        deposits=deposits+1;
        return getNumberofDeposits();  
    }

    function getNumberofDeposits() constant returns(uint)
    {
        return deposit;
    }
    
    function Killl();{
    if(msg.sendor==creator)
    selfdestruct(creator);
    }
}

您使用的是旧版 solidity 的语法,当前 0.8 版本不支持该语法。

首先,要消除语法错误,请将 function PiggyBank public() 替换为 function PiggyBank() public

在旧版本的 Solidity(最高 0.5)中,使用与合约同名的函数作为构造函数。在当前版本 0.8 中,您需要使用 constructor 关键字 - 否则任何人都可以随时公开调用该函数(不仅仅是在合约部署期间)。

// replace `function PiggyBank public()` to `constructor()`
constructor() {
    creator=msg.sendor;
    deposits=0;
}

然后又出现了一些语法错误(函数定义不正确;Killl() 函数定义处多了一个分号;缺少可见性修饰符),类型错误(selfdestruct 参数需要 payable) 和拼写错误(您的代码使用 msg.sendor 而不是 msg.sender)出现。查看更正后的代码:

pragma solidity ^0.8.0;

contract PiggyBank {
    address creator;
    uint deposits;

    constructor() {
        creator=msg.sender;
        deposits=0;
    }

    function deposit() public payable returns(uint) {
        if(msg.value>0) {
            deposits=deposits+1;
        }
        return getNumberofDeposits();  
    }

    function getNumberofDeposits() public view returns(uint) {
        return deposits;
    }
    
    function Killl() public {
        if(msg.sender==creator) {
            selfdestruct(payable(creator));
        }
    }
}