pragma solidity ^0.4.4;
/*
pragma: 版本声明
solidity: 开发语言
0.4.4:当前合约主版本,0.4代表主版本,.4代表修复bug升级版本
^: 代表向上兼容,0.4.4 ~ 0.4.9可以对我们当前的代码进行编译
*/
//相当于 class Person extends contract
contract Person {
uint _height; //身高
uint _age; //年龄
address _owner; //代表合约的拥有者
//方法名和合约名相同时就属于构造函数
function Person() public {
_height = 180;
_age = 29;
_owner = msg.sender;
}
function owner() public constant returns (address) {
return _owner;
}
function setHeight(uint height) public {
_height = height;
}
function height() public constant returns (uint) {
return _height;
}
function setAge(uint age) public {
_age = age;
}
function age() public constant returns (uint) {
return _age;
}
function kill() public {
if (_owner == msg.sender) {
//析构函数
selfdestruct(_owner);
}
}
}
在http://remix.ethereum.org/#optimize=false&version=soljson-v0.4.4+commit.4633f3de.js部署该合约。
部署后合约的地址就是图示: 0x692a70d2e424a56d2c6c27aa97d1a86395877b3a
如上图,0xdd就是我们创建合约账号的地址,0x36就是合约的地址。会根据合约的字节码(input)中的数据大小,决定写入区块链需要消耗的gas。
**说明:**属性的默认类型为internal
,internal
和private
类型的属性都不能被外部访问,当属性的类型为public
类型时,会生成一个和属性名相同并且返回值就是当前属性的get函数。
比如
uint public _money;
会生成一个
function _money() constant returns (uint) {
return _money;
}
我们自己实现的get方法会覆盖默认的方法,如下:
pragma solidity ^0.4.4;
contract Person {
uint public _money;
function _money() public pure returns (uint) {
return 100;
}
}
会返回100。
默认为public类型。
子合约只可以继承public类型的函数,而子合约可以继承public和internal类型的属性。
如下图,public属性被继承,并且可见。internal类型属性被继承但不可见。
memory
值传递。
storage
引用传递。
以太坊中地址长度为20字节,一共160位,所以address其实亦可以用uint160来声明。
pragma solidity ^0.4.4;
contract Test {
address _owner;
uint160 _ownerUint;
function Test() {
_owner = 0x1d9a300b7eead6edd42e01a54fcf77dda8dd8a2b;
_ownerUint = 168999232415997907000912496545158276514095925803;
}
function owner() constant returns (address) {
return _owner;
}
function ownerUint160() constant returns (uint160) {
return uint160(_owner);
}
function ownerUintToAddress() constant returns (address) {
return address(_ownerUint);
}
}
pragma solidity ^0.4.4;
//第一次部署地址: 0xdfd0be3b775ce7b54eacca4c18b0d0a3a47842d3
//第二次部署地址: 0xef00a5a2e7e260156ea9eeec0ff57c0387d7b3f3
contract Test {
address public _owner;
uint public _number;
function Test() {
_owner = msg.sender;
_number = 100;
}
function msgSenderAddress() constant returns (address) {
return msg.sender;
}
function setNumberAdd1() {
_number = _number + 5;
}
function setNumberAdd2() {
if (_owner == msg.sender) {
_number = _number + 10;
}
}
function returnContractAddress() constant returns (address) {
return this; //合约地址
}
}
在上面的实例中,_owner
在部署合约的时候,创建示例并初始化为部署者的地址,后续不再改变。而msg.sender
是动态改变的,取决于每次消息发送者。
pragma solidity ^0.4.4;
contract getBanlance {
function getBalance(address addr) constant returns (uint) {
return addr.balance;
}
}
pragma solidity ^0.4.4;
contract PayableKeyword{
// 从合约发起方向 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址转入 msg.value 个以太币,单位是 wei
function deposit() payable{
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
Account2.send(msg.value);
}
// 读取 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址的余额
function getAccount2Balance() constant returns (uint) {
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
return Account2.balance;
}
// 读取合约发起方的余额
function getOwnerBalance() constant returns (uint) {
address Owner = msg.sender;
return Owner.balance;
}
}
pragma solidity ^0.4.4;
contract PayableKeyword{
function deposit() payable returns (bool){
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
return Account2.send(msg.value);
}
function getAccount2Balance() constant returns (uint) {
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
return Account2.balance;
}
function getOwnerBalance() constant returns (uint) {
address Owner = msg.sender;
return Owner.balance;
}
}