写在前面
- 环境: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中均可被访问
// 若改为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去访问