Solidez + ejemplos

Tabla de contenido

Para convertirse en un contrato inteligente que pueda ejecutarse en Ethereum, el código fuente de Solidity debe seguir los siguientes pasos

Compilador de solidez

remezclar

Solc

 问题:Advertencia: el identificador de licencia SPDX no se proporciona en el archivo de origen

 问题:TypeError: la ubicación de los datos debe ser "memoria" o "datos de llamada" para el parámetro en función, pero no se proporcionó ninguno

 Caso número uno

caso dos 


Para convertirse en un contrato inteligente que pueda ejecutarse en Ethereum, el código fuente de Solidity debe seguir los siguientes pasos

  1. El código fuente del contrato inteligente escrito en Solidity debe compilarse en bytecode (Bytecode) con un compilador primero , y la especificación de interfaz binaria (Application Binary Interface, ABI para abreviar) del contrato inteligente se generará al mismo tiempo durante el proceso de compilación ;
  2. Implemente el código de bytes en la red Ethereum a través de una transacción (Transacción) , y cada implementación exitosa generará una nueva cuenta de contrato inteligente
  3. Las DApps escritas en Javascript generalmente usan web3.js + ABI para llamar a funciones en contratos inteligentes para leer y modificar datos

Compilador de solidez

remezclar

Solc

  •  solc es uno de los objetivos de compilación de la biblioteca de código fuente de Solidity, es el compilador de línea de comandos de Solidity
  • El compilador de Solidity solicjs se puede instalar fácilmente usando npm
npm install -g solc
# -g是全局安装,也可以不加自己选择目的文件夹

问题:Advertencia: el identificador de licencia SPDX no se proporciona en el archivo de origen

问题: Advertencia: el identificador de licencia SPDX no se proporciona en el archivo de origen. Antes de publicar, considere agregar un comentario que contenga "SPDX-License-Identifier: <SPDX-License>" a cada archivo fuente. Use "SPDX-License-Identifier: UNLICENSED" para código que no sea de fuente abierta. Consulte https://spdx.org para obtener más información. 

Causa: La licencia SPDX se introdujo a partir de Solidity ^0.6.8. Entonces necesita usar SPDX-License-Identifier en su código

Solución: agregue la primera oración del archivo .sol 

// SPDX-License-Identifier: MIT

 问题:TypeError: la ubicación de los datos debe ser "memoria" o "datos de llamada" para el parámetro en función, pero no se proporcionó ninguno

Motivo: esto se debe a la actualización de solidity versión 0.5.0. Solo necesitaagregar memoria después de usar la cadena .

Solución:

 Caso número uno

// SPDX-License-Identifier: MIT
// pragma solidity >0.4.22 <0.5.0;
pragma solidity ^0.8.3;
contract SimpleStorage{
    uint myData;
    function setData(uint newData) public{
        myData = newData;
    
    }
    // 返回值类型需要加上 returns + 返回值类型, 例如 returns(uint)
    // view 表示只读不写
    function getData() public view returns(uint){
        return myData;
    }

    // 返回两个数
    function pureAdd(uint a,uint b) public pure returns(uint sum, uint _a){
        return (a + b, a);
    }
}

caso dos 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
contract Car{
    string brand;       // 车牌
    uint public price;     // 价格

    // 构造函数,合约创建时自动调用
    constructor(string memory initBrand,uint initPrice){
        brand = initBrand;
        price = initPrice;
    }

    function setBrand(string memory newBrand) public {
        brand = newBrand;
    }

    function getBrand() public view returns(string memory){
        return brand;
    }

    function setPrice(uint newPrice) public {
        price = newPrice;
    }
}

caso tres

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;

contract Coin{
    address public minter;  // 铸币者
    mapping(address => uint) public balances;    // 所有账号
    event Sent(address from,address to,uint amount);

   /**
    * 功能: 初始化
    */
    constructor(){
        minter = msg.sender;
    }

   /**
    * 功能: 铸币
    * @param receiver
    * @param amount
    */
    function mint(address receiver, uint amount) public{
        // 调用铸币的人必须是规定的铸币人
        require(msg.sender == minter);
        // 铸币人的 账户余额 += amount
        balances[receiver] += amount;
    }

   /**
    * 功能: 发币
    * @param receiver
    * @param amount
    */
    function send(address receiver, uint amount) public{
        // msg.sender 代表调用这个函数的人
        // 发币人的账户要大于等于 amount
        require(balances[msg.sender] >= amount);
        // 发币人的 账户余额 -= amount
        balances[msg.sender] -= amount;
        // 接收人的 账户余额 += amount
        balances[receiver] += amount;
        emit Sent(msg.sender, receiver, amount);
    }
}

caso cuatro

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;

contract Try{
    uint public a;
    uint public b;
    uint[] public data;
    function f() public{
        uint[] storage x = data;
        x.push(2);
        data = x;
    }
}

contract FakeHoneyPot{
    uint public luckyNum = 12;
    struct Guess{
        address player;
        uint number;
    }
    Guess[] guessHistory;
    address owner = msg.sender;
    function guess(uint _num) public payable{
        guessHistory.push(Guess({
            player:msg.sender,
            number:_num
        }));
        if(_num == luckyNum){
            payable(msg.sender).transfer(msg.value * 2);
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/m0_46262108/article/details/123316069
Recomendado
Clasificación