編寫智慧合約

FreeeLinux發表於2018-10-20

實現一個智慧合約

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

}

相關文章