天天看點

深入了解Solidity——建立合約建立合約(Creating Contracts)

Solidity的合約類似于面向對象語言中的類。它們包含存放持久化資料的狀态變量和可修改這些變量的函數。調用不同的合約執行個體上的函數将執行EVM函數調用,進而切換上下文,使得狀态變量不可通路。

建立合約(Creating Contracts)

合約可以從“外部”建立,也可以由Solidity合約創立。

像Remix這類IDE,可以用UI界面使建立過程無縫連接配接。

最好在Ethereum上以程式設計方式通過Web3.js建立合約。到今天為止,它有一種叫做web3.eth.Contract的方法來幫助合約的建立。

當建立一個合約時,它的構造函數被執行一次。構造函數是可選的。隻允許一個構造函數,這意味着不支援重載。

在内部,構造函數的參數要放在在合約代碼編譯成的ABI之後,但是如果使用

Web3.js

,則不必關心這一點。

如果是一個合約要創立另外一個合約,被創立的合約的源碼(和二進制代碼)要能被創立者知曉。這意味着循環建立依賴就成為不可能的事情。

pragma solidity ^;

contract OwnedToken {
    // TokenCreator是在下面定義的合約類型
    // 若它本身不用于建立新的合約的話,它就是一個引用
    TokenCreator creator;
    address owner;
    bytes32 name;

    // 這個是記載建立者者和指派名稱的構造函數
    function OwnedToken(bytes32 _name) {
        owner = msg.sender;
        // 我們做一次由`address`到`TokenCreator` 的顯式轉換,
        // 確定調用合約的類型是 TokenCreator,(因為沒有辦法來檢測這一點)
        creator = TokenCreator(msg.sender);
        name = _name;
    }

    function changeName(bytes32 newName) {
        // 僅僅是創立者可以改變名稱--
        // 因為合約是隐式轉換成位址上,是以這種比較是可能的
        if (msg.sender == creator) name = newName;
    }

    function transfer(address newOwner) {
        // 隻有目前合約所有者可以轉移 token
        if (msg.sender != owner) return;
        // 我們還要詢問合約建立者"轉移是否成功"
        // 注意這會調用合約定義在下面的函數
        // 如果函數調用失敗,(如gas用完了等原因)
        // 程式的執行将立刻停止
        if (creator.isTokenTransferOK(owner, newOwner))
            owner = newOwner;
    }}

contract TokenCreator {
    function createToken(bytes32 name)
       returns (OwnedToken tokenAddress)
    {
        // 創立一個新的Token合約,并且傳回它的位址
        // 從 JavaScript觀點看,傳回的位址類型是"address"
        // 這個是和ABI最接近的類型
        return new OwnedToken(name);
    }

    function changeName(OwnedToken tokenAddress, bytes32 name) {
        // "tokenAddress" 的外部類型也是"address".
        tokenAddress.changeName(name);
    }

    function isTokenTransferOK(
        address currentOwner,
        address newOwner
    ) returns (bool ok) {
        // 檢查各種條件
        address tokenAddress = msg.sender;
        return (sha3(newOwner) & ) == (bytes20(tokenAddress) & );
    }
}
           

上一篇:深入了解Solidity——Assert, Require, Revert 和 Exceptions

下一篇:深入了解Solidity——可見性和Getters

繼續閱讀