罗韭菜的solidity 学习(一)solidity类、属性与方法访问权限

写在前面

  • 环境:atom
  • 需要的插件:
    autocomplete-solidity 代码自动补全
    linter-solium、linter-solidity 代码错误检查
    language-ethereum 支持solidity代码高亮以及solidity代码片段

一、solidity类的编写

pragma solidity^0.4.4;
/*
pragma:版本生命
0.4.4:当前合约版本,.4代表修复bug的升级版
^:向上兼容
*/

contract person {
  uint _height;// 属性名加下划线
  uint _age;
  //address是一个160位数字
  address _owner; //合约的拥有者

//方法名和合约名相同时就属于构造函数,在创建对象时,构造函数会自动最先被调用
// 默认构造身高为180,年龄为29的对象
  function person(){
    _height = 180;
    _age = 29;
    _owner = msg.sender;
  }

  function owner() constant returns (address){
    return _owner;
  }

  // 修改属性
  function setHeight(uint height){
    _height = height;
  }
  //其实就是get方法,查看or读取_height属性
  // 【注意】constant 代表这个方法只读,如果不加的话,调用它就要加.call,且需要加return类型
  function height() constant returns(uint){
    return _height;
  }

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

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

  //selfdestruct 是析构函数
  function kill(){
    //【注意】msg 是个全局变量,
    if(_owner == msg.sender){
      selfdestruct(_owner);
    }
  }
}

注意

  • msg.sender 是用于部署合约的钱包地址
  • address 是合约地址
  • 理论上每次创建合约对象时,都会生成不同的合约地址,但是在remix上用同一个钱包账户创建,同一个代码的合约,由于bytecode一样,只会生成一样的合约地址(节省区块空间)

二、属性的访问权限

// public > internal(默认访问权限) > private
// public 会自动生成一个和属性名相同且返回值就是当前属性的get函数。
// 如若为public属性再写一个get函数,则覆盖默认的get函数

三、方法的访问权限

// 合约中的函数,默认为public类型

contract person {
  function age() constant returns (uint){
    return 55;
  } 
  function height() constant returns (uint) {
    return 172;
  }
  function money() constant returns (uint) {
    return 320000;
  }
}
  • 在remix中均可被访问


    remix编译

// 若改为private或internal

contract person {

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

  function height() constant internal  returns (uint) {
    return 172;
  }

  function money() constant private  returns (uint) {
    return 320000;
  }
  
}
  • 则remix不能访问private与internal 的方法

属性默认权限为internal, 只有public类型的属性才可能供外部访问,internal 和 private 类型的属性只能在合约内部使用。

函数的权限默认是public类型,public类型的函数可供外部访问,而internal和privtate的函数不能通过指针进行访问,哪怕是在内部通过this访问,都会报错。在合约内部访问,我们可以直接访问函数就可以了。

备注 不管是属性还是方法,只有是public类型时,才可以通过合约地址进行访问。合约内部的this就是当前合约的地址。在合约内部如果要访问internal和private类型的属性,或者是函数直接访问即可,不要试图通过this去访问

你可能感兴趣的:(罗韭菜的solidity 学习(一)solidity类、属性与方法访问权限)