第一个solidity智能合约遇到的坑

自学solidity智能合约遇到的第一个坑,照着老师的写了一段代码,编译的时候遇到版本问题,语法发生了巨大改变

  • 范例的代码:
    • 如果没有选择正确的版本号,编译会出现如下错误,我们来一步一步解决:
    • 下面我把修改后的完整代码贴出来:

范例的代码:

pragma solidity ^0.4.4; 表示0.4.4以上,0.5以下版本兼容:
编译环境是在http://remix.ethereum.org
需要注意选择右上角的版本号,把0.5改成0.4.4以上的任意版本

pragma solidity ^0.4.4;
/*
pragma: 版本声明
solidity:开发语言
0.4.4当前合约的版本
^:代表向上兼容,0.4.4~0.4.9可以对当前代码进行编译
*/

contract Person {
  uint _height; //声明属性,_代表规范
  uint _age;
  address _owner; //合约的拥有者

  // 方法名与合约名相同时属于构造函数 , 同 init方法
  function Person() {
    _height = 180;
    _age = 29;
    _owner = msg.sender;
  }
  function owner() constant returns (address) {
    return _owner;
  }
  // set方法,修改height属性
  function setHeight(uint height) {
    _height = height;
  }

  //get方法,读取height属性, constant代表方法只读,好处是不消耗GAS
  // return(uint)代表返回值类型(无符号整形)
  function height() constant returns (uint) {
    return _height;
  }

  function setAge(uint age) {
    _age = age;
  }

  function age() constant returns (uint) {
    return _age;
  }

  function kill() {
    if (_owner == msg.sender){
      //析构函数
      selfdestruct(msg.sender);
    }
  }
} 

如果没有选择正确的版本号,编译会出现如下错误,我们来一步一步解决:

  1. browser/ballot.sol:1:1: SyntaxError: Source file requires different compiler version (current compiler is 0.5.1+commit.c8a2cb62.Emscripten.clang - note that nightly builds are considered to be strictly less than the released version
    pragma solidity ^0.4.4;
    ---------------------
    需要把版本号改成:pragma solidity ^0.5.1;

  2. browser/ballot.sol:20:20: ParserError: The state mutability modifier “constant” was removed in version 0.5.0. Use “view” or “pure” instead.
    function owner() constant returns (address) {
    ------
    Solidity 旧版本只有constant,新版本将constant拆成了view和pure。view的作用和constant一模一样,可以读取状态变量但是不能改;pure则更为严格,pure修饰的函数不能改也不能读状态变量,否则编译通不过。
    所以,我们这里需要把constant改成view就可以了

  3. browser/ballot.sol:15:3: SyntaxError: Functions are not allowed to have the same name as the contract. If you intend this to be a constructor, use “constructor(…) { … }” to define it.
    function Person() {
    ^ (Relevant source part starts here and spans across multiple lines).

    这里需要吧 function Person( ) 改成: constructor()

  4. browser/ballot.sol:15:3: SyntaxError: No visibility specified. Did you intend to add “public”?
    constructor() {
    ^ (Relevant source part starts here and spans across multiple lines).

    这里是说函数需要后面要加 public , 注意:每个函数都要加。补充:其实也可以写private 或者 internal, 只是这样的话生成的合约是不显示这个方法的
    举例:

  constructor() public {
    _height = 180;
    _age = 29;
    _owner = msg.sender;
  }
  • 完成任务

下面我把修改后的完整代码贴出来:

pragma solidity ^0.5.1;
/*
pragma: 版本声明
solidity:开发语言
0.4.4当前合约的版本
^:代表向上兼容,0.4.4~0.4.9可以对当前代码进行编译
*/

contract Person {
  uint _height; //声明属性,_代表规范
  uint _age;
  address _owner; //合约的拥有者

  // 方法名与合约名相同时属于构造函数 , 同 init方法
  constructor() public {
    _height = 180;
    _age = 29;
    _owner = msg.sender;
  }
  function owner() public view returns (address) {
    return _owner;
  }
  // set方法,修改height属性
  function setHeight(uint height) public {
    _height = height;
  }

  //get方法,读取height属性, constant代表方法只读,好处是不消耗GAS
  // return(uint)代表返回值类型(无符号整形)
  function height() public view returns (uint) {
    return _height;
  }

  function setAge(uint age) public {
    _age = age;
  }

  function age() public view returns (uint) {
    return _age;
  }

  function kill() public {
    if (_owner == msg.sender){
      //析构函数
      selfdestruct(msg.sender);
    }
  }
}

你可能感兴趣的:(Solidity)