Error al crear contratos en la billetera Ethereum

En primer lugar, me gustaría proporcionar un descargo de responsabilidad. No soy desarrollador , nunca estudié códigos y nunca escribí scripts desde que tenía 14 años. Estoy haciendo este proyecto para la empresa en la que trabajo en este momento, y mientras intentaba crear un token a través de ethereum, constantemente recibo este error:

"throw" is deprecated in favour of "revert()", "require()" and "assert()".
        if (_to == 0x0) throw;                               
// Prevent transfer to 0x0 address. Use burn() instead
                        ^---^, 

Este error aparece cada vez que escribo el código proporcionado por ethereum, su plantilla. No sé por qué sucede esto, ni sé cómo solucionarlo. Busqué en todas partes en línea, pero parece que no puedo encontrar a nadie más que enfrente el mismo problema. ¿Cómo puedo solucionar esto? ¿Estoy haciendo esto mal? es la primera vez que trato de implementar un contrato en el servidor y no en la red de prueba. ¡Gracias de antemano!

Aquí está el código:

pragma solidity ^0.4.8;
contract tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData); }

contract MyToken {
/* Public variables of the token */
string public standard = 'Token 0.1';
string public name;
string public symbol;
uint8 public decimals;
uint256 public totalSupply;

/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;

/* This generates a public event on the blockchain that will notify clients */
event Transfer(address indexed from, address indexed to, uint256 value);

/* This notifies clients about the amount burnt */
event Burn(address indexed from, uint256 value);

/* Initializes contract with initial supply tokens to the creator of the contract */
function MyToken(
    uint256 initialSupply,
    string tokenName,
    uint8 decimalUnits,
    string tokenSymbol
    ) {
    balanceOf[msg.sender] = initialSupply;              // Give the creator all initial tokens
    totalSupply = initialSupply;                        // Update total supply
    name = tokenName;                                   // Set the name for display purposes
    symbol = tokenSymbol;                               // Set the symbol for display purposes
    decimals = decimalUnits;                            // Amount of decimals for display purposes
}

/* Send coins */
function transfer(address _to, uint256 _value) {
    if (_to == 0x0) throw;                               // Prevent transfer to 0x0 address. Use burn() instead
    if (balanceOf[msg.sender] < _value) throw;           // Check if the sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows
    balanceOf[msg.sender] -= _value;                     // Subtract from the sender
    balanceOf[_to] += _value;                            // Add the same to the recipient
    Transfer(msg.sender, _to, _value);                   // Notify anyone listening that this transfer took place
}

/* Allow another contract to spend some tokens in your behalf */
function approve(address _spender, uint256 _value)
    returns (bool success) {
    allowance[msg.sender][_spender] = _value;
    return true;
}

/* Approve and then communicate the approved contract in a single tx */
function approveAndCall(address _spender, uint256 _value, bytes _extraData)
    returns (bool success) {
    tokenRecipient spender = tokenRecipient(_spender);
    if (approve(_spender, _value)) {
        spender.receiveApproval(msg.sender, _value, this, _extraData);
        return true;
    }
}        

/* A contract attempts to get the coins */
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
    if (_to == 0x0) throw;                                // Prevent transfer to 0x0 address. Use burn() instead
    if (balanceOf[_from] < _value) throw;                 // Check if the sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]) throw;  // Check for overflows
    if (_value > allowance[_from][msg.sender]) throw;     // Check allowance
    balanceOf[_from] -= _value;                           // Subtract from the sender
    balanceOf[_to] += _value;                             // Add the same to the recipient
    allowance[_from][msg.sender] -= _value;
    Transfer(_from, _to, _value);
    return true;
}

function burn(uint256 _value) returns (bool success) {
    if (balanceOf[msg.sender] < _value) throw;            // Check if the sender has enough
    balanceOf[msg.sender] -= _value;                      // Subtract from the sender
    totalSupply -= _value;                                // Updates totalSupply
    Burn(msg.sender, _value);
    return true;
}

function burnFrom(address _from, uint256 _value) returns (bool success) {
    if (balanceOf[_from] < _value) throw;                // Check if the sender has enough
    if (_value > allowance[_from][msg.sender]) throw;    // Check allowance
    balanceOf[_from] -= _value;                          // Subtract from the sender
    totalSupply -= _value;                               // Updates totalSupply
    Burn(_from, _value);
    return true;
}

}

El código es del ejemplo del token de ethereum.org

Por favor, pon tu código o donde estás usando este "tiro".
¿Qué pasa si (ahora < hora de cierre && msg.value > 0 && (privateCreation == 0 || privateCreation == msg.sender)) { etc } throw; ?
@Husrequire(now < closingTime && msg.value > 0 && (privateCreation == 0 || privateCreation == msg.sender)); { etc }

Respuestas (3)

throwquedó en desuso en la versión 0.4.13 de solidity . Debe reemplazar cada línea que dice if(condition) throw;con require(opposite of condition);. Por ejemplo:

if (_to == 0x0) throw;

se convierte

require(_to != 0x0);

throwse usa varias veces a lo largo de su código, debe cambiar cada una

pues sera este:

    /* Send coins */
function transfer(address _to, uint256 _value) {
    require (_to != 0x0) ;                               // Prevent transfer to 0x0 address. Use burn() instead
    if (balanceOf[msg.sender] < _value);           // Check if the sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]); // Check for overflows
    balanceOf[msg.sender] -= _value;                     // Subtract from the sender
    balanceOf[_to] += _value;                            // Add the same to the recipient
    Transfer(msg.sender, _to, _value);                   // Notify anyone listening that this transfer took place
}

O:

    /* Send coins */
function transfer(address _to, uint256 _value) {
    require (_to != 0x0) ;                               // Prevent transfer to 0x0 address. Use burn() instead
    if (balanceOf[msg.sender] < _value) require;           // Check if the sender has enough
    if (balanceOf[_to] + _value < balanceOf[_to]) require; // Check for overflows
    balanceOf[msg.sender] -= _value;                     // Subtract from the sender
    balanceOf[_to] += _value;                            // Add the same to the recipient
    Transfer(msg.sender, _to, _value);                   // Notify anyone listening that this transfer took place
}

.. si () requiere; ¿o sin?

Esto es solo una advertencia y su código aún debería compilarse correctamente.

Puede consultar el enlace a continuación con respecto al problema abierto en Github sobre la desaprobación total de throw.

Lanzamiento degradante

throwconsumirá todo su gas donde revertdevolverá el gas no utilizado.

también puede consultar documentos de solidez .