Warum werden Fehler in diesem Vertrag angezeigt?

Eigentlich habe ich den Code in mehrere Dateien geschrieben, aber da ich den Code verifizieren und veröffentlichen muss, habe ich versucht, den Code zu verflachen. Aber jetzt zeigt es viel zu viele Fehler. Ich habe den folgenden Code mit Fehlermeldungen in Kommentare eingefügt. Können Sie mir bitte bei den Fehlern helfen?

pragma solidity 0.4.25;

library SafeMath {

/**
* @dev Multiplies two numbers, reverts on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (a == 0) {
  return 0;
}

uint256 c = a * b;
require(c / a == b);

return c;
}

/**
* @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0); // Solidity only automatically asserts when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold

return c;
}

 /**
 * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
 */
 function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
uint256 c = a - b;

return c;
}

/**
* @dev Adds two numbers, reverts on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);

return c;
}

/**
* @dev Divides two numbers and returns the remainder (unsigned integer modulo),
* reverts when dividing by zero.
*/
 function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0);
return a % b;
}
}


interface IERC20{        
function totalSupply() constant returns (uint256 totalSupply);
/**browser/ballot.sol:65:46: Warning: This declaration shadows an existing declaration.
function totalSupply() constant returns (uint256 totalSupply);
                                         ^-----------------^
browser/ballot.sol:65:5: The shadowed declaration is here:
function totalSupply() constant returns (uint256 totalSupply);
^------------------------------------------------------------^
**/
function balanceOf(address _owner) constant returns (uint256 balance);
function transfer(address _to, uint256 _value) returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
function approve(address _spender, uint256 _value) returns (bool success);
function allowance(address _owner, address _spender) constant returns (uint256 remaining);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

contract FuncToken is IERC20{

using SafeMath for uint256;

uint public constant _totalSupply = 0;

string public constant symbol = "UB";
string public constant name = "UNIFIED BET";
uint8 public constant decimals = 18;

//1 ether = 1 UB
uint256 public constant RATE = 1;

address public owner;

mapping (address => uint256) balances;
mapping (address => mapping(address => uint256)) allowed;

function () payable{
    createToken();
}

constructor (){
    owner = msg.sender;

}

function createToken() payable {
    require(msg.value > 0);

    uint256 tokens = msg.value;
    balances[msg.sender] = balances[msg.sender].add(tokens);

    owner.transfer(msg.value);
}

function totalSupply() constant returns (uint256 totalSupply){
    return _totalSupply;
}

function balanceOf(address _owner) constant returns (uint256 balance){
    return balances[_owner];
}

function transfer(address _to, uint256 _value) returns (bool success){
    require (
        balances[msg.sender] >= _value
        && _value > 0
        );
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        Transfer(msg.sender, _to, _value);
        /**browser/ballot.sol:126:13: Warning: Invoking events without "emit" prefix is deprecated.
        Transfer(msg.sender, _to, _value);
        ^-------------------------------^ **/
        return true;

}

function transferFrom(address _from, address _to, uint256 _value) returns (bool success){
    require(
        allowed[_from][msg.sender] >= _value
        && balances[_from] >= _value
        && _value > 0
        );

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].add(_value);
        Transfer(_from, _to, _value);
        return true;
}

function approve(address _spender, uint256 _value) returns (bool success){
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
}

function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
    return allowed[_owner][_spender];
}

}

Jede Hilfe wird geschätzt. Es gibt mehr Fehler mit denselben Warnungen, aber wenn Sie mir einen mitteilen können, werde ich andere beheben. Alle Fehler sind in /** **/

Antworten (2)

Dies sind meistens Warnungen, keine Fehler.

Um Ihnen den Einstieg zu erleichtern, bezieht sich das erste, was Sie kommentiert haben, auf Folgendes:

interface IERC20{        
    function totalSupply() constant returns (uint256 totalSupply);
    /**browser/ballot.sol:65:46: Warning: This declaration shadows an existing 
    declaration.
    function totalSupply() constant returns (uint256 totalSupply);

Und das:

function totalSupply() constant returns (uint256 totalSupply){
    return _totalSupply;
}

Das Problem besteht darin, dass Ihr Variablenname mit Ihrem Funktionsnamen identisch ist. Auch im zweiten dieser Snippets verwenden Sie, _totalSupplywährend der von Ihnen übergebene Parameter totalSupply, ohne Unterstrich, ist.

Ändern Sie wie folgt (mit einem Unterstrich) oder ändern Sie den Variablennamen in etwas ganz anderes, um Verwechslungen mit dem Funktionsnamen zu vermeiden:

function totalSupply() constant returns (uint256 _totalSupply);

Alle anderen Warnungen scheinen darauf zurückzuführen zu sein, dass Sie keine Sichtbarkeiten für Funktionen und Variablen angegeben haben. Sehen Sie sich den entsprechenden Abschnitt in der Dokumentation an: Function Visibility Specificators .

Danke für die Hilfe. Aber warum sind die ausgegebenen Token nicht übertragbar und in Etherscan nicht sichtbar, obwohl sie nach dem Hinzufügen des Tokens in Metamask sichtbar sind?

1) fügen Sie einfach „emit“ vor dem Ereignisaufruf hinzu, da sich die Grammatik nach 0.4.23 ändert, wenn ich mich nicht irre, also gibt es nichts zu verstehen, fügen Sie es einfach hinzu

2) Im Gegenteil, der zweite Fehler deutet darauf hin, dass Sie tiefer in die Lektionen einsteigen müssen. Ich schlage vor, dass Sie sie klar haben: Vererbung, öffentliche Variablen, impliziter Getter, Gültigkeitsbereich von Variablen und Funktionen. Es ist nicht sinnvoll, hier nur eine Antwort zu haben, wenn Sie mit dieser Entwicklung fortfahren möchten, denke ich freundlicherweise, dass es besser ist, ein bisschen mehr Forschungsarbeit zu leisten. Es wird Ihnen klar sein, was Sie brauchen!

Besten Wünsche!