So erstellen Sie ein Token, das mit einer Zeichenfolge übereinstimmt

Ich möchte jedes Mal 15 Token erstellen, wenn die releaseToken()Methode die Zeichenfolge empfängt hello. Ich habe versucht, diese Bedingung zu erstellen, aber es funktioniert nicht. Dies ist der Code, den ich bisher geschrieben habe:

pragma solidity ^0.4.11;

import './IERC20.sol';
import './SafeMath.sol';

contract testcoin{

    using SafeMath for uint256;

    uint public _totalSupply = 0;

    string public constant symbol = "TES";
    string public constant name = "testcoin";
    uint8 public constant decimals = 3;
    string public contractString = 'hello';

    uint256 public constant RATE = 500;
    address public owner;

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

    function releaseToken(string _string)  payable{
        require(keccak256(_string) == keccak256(contractString));
        createTokens();
    }

    function testcoin(){
        owner = msg.sender;
    }

    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] -= _value;
        balances[_to] += _value;
        Transfer(msg.sender, _to, _value);
        return true;
    }

    function createTokens() payable {
        uint256 tokens = msg.value.mul(RATE);
        balances[msg.sender] = balances[msg.sender].add(tokens);
        _totalSupply = _totalSupply.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); //changed
        balances[_to] += _value;
        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] -= _value;
        balances[_to] += _value;
        allowed[_from][msg.sender] -= _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];
    }

    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

Wo soll ich es reparieren? Vielen Dank für Ihre Antwort.

Welchen Fehler bekommst du? Ihre Anforderungslogik scheint korrekt zu sein, und ich gehe davon aus, dass die einfachen Anführungszeichen um "Hallo" nur aus einem schlechten Kopieren und Einfügen stammen.
Was ist falsch an einfachen Anführungszeichen?

Antworten (1)

Ihr Code wird nicht kompiliert, weil es zwei Definitionen einer Reihe von Funktionen gibt: totalSupply, transfer, und balanceOf. Das habe ich entfernt (und auch SafeMath, nur weil ich es in Remix nicht zur Hand hatte). Danach schienen die Dinge zu funktionieren. Ich habe den Vertrag bereitgestellt und er hatte einen totalSupplyWert von 0. Dann habe ich angerufen releaseToken("hello"), 1 Wei gesendet und totalSupplyauf 500 erhöht.

Stellen Sie sicher, dass Sie Ether mit Ihrem Anruf an senden releaseToken. Im Moment ruft es nur an createTokens, was 500 Einheiten pro gesendetem Wei erzeugt.

Wenn Sie stattdessen nur 15 Token erstellen möchten, ohne dass eine Zahlung erforderlich ist, möchten Sie stattdessen Folgendes:

function releaseToken(string _string) public {
    require(keccak256(_string) == keccak256(contractString));
    uint256 amount = 15 * uint256(10)**decimals;
    balances[msg.sender] += amount;
    _totalSupply += amount;
}