编写智能合约

实现一个智能合约

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。

Solidity合约中属性和访问权限

**说明:**属性的默认类型为internalinternalprivate类型的属性都不能被外部访问,当属性的类型为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。

Solidity合约中属性的访问权限

默认为public类型。

在这里插入图片描述

Solidity合约单继承

子合约只可以继承public类型的函数,而子合约可以继承public和internal类型的属性。

如下图,public属性被继承,并且可见。internal类型属性被继承但不可见。

在这里插入图片描述

Solidity合约函数的重写

Solidity值传递和引用传递

memory 值传递。
storage引用传递。

在这里插入图片描述

在这里插入图片描述

Solidity Address类型

以太坊中地址长度为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);
    }
}

Solidity的msg.sender

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是动态改变的,取决于每次消息发送者。

查看address余额

pragma solidity ^0.4.4;

contract getBanlance {
    function getBalance(address addr) constant returns (uint) {
        return addr.balance;
    }
}

transfer转账

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;
} 

}

send转账

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;
    } 

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值