olidity語言開發以太坊智慧合約中的繼承
我們已經探索了很多主題,在編寫智慧合約時我們發現經常使用相同的模式:例如,智慧合約具有在建構函式中設定的所有者,然後生成修改器以便僅讓所有者使用一些功能。如果我們制定實施這些功能的基礎合約並在未來的智慧合約中重複使用它們那該怎麼辦?你一定猜得到,我們將使用繼承。
在Solidity中,繼承與經典的物件導向程式語言非常相似。你首先編寫基本智慧合約並告知你的新智慧合約將從基礎合約繼承。
你還必須透過複製包含多型的程式碼來了解Solidity支援多重繼承。所有函式呼叫都是虛擬函式,這意味著會是呼叫派生函式最多的函式,除非明確給出了合約名稱。當某一個智慧合約從多個合約繼承時,只在區塊鏈上建立一個智慧合約,並將所有基礎合約中的程式碼複製到建立的智慧合約中。
讓我們寫下我們的基本智慧合約:它將讓我們輕鬆地為我們的合約新增所有權。我們將其命名為
Ownable
。
的員工寫了很多可以在智慧合約中使用的可重用程式碼。這些程式碼段可透過其工具或其
獲得。
這是程式碼:
pragma solidity ^0.4.11;/** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */contract Ownable { address public owner; /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function Ownable() { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) onlyOwner { require(newOwner != address(0)); owner = newOwner; } }
我們經常寫的另一種模式是破壞我們的合約並將合約中儲存的資金轉移給所有者或另一個地址的能力。重要的是我們不希望任何人能夠破壞我們的合約,所以我們的
Destructible
應該繼承
Ownable
。繼承是使用智慧合約名稱後面的
is
關鍵字完成的。
必須注意,它是Solidity,預設情況下是函式,或者可以從派生類訪問。與其他程式語言一樣,你可以指定從外部或派生合約中可以訪問的內容。函式可以指定為
external
,
public
,
internal
,
private
,預設為
public
。
-
external
:外部函式是智慧合約介面的一部分,這意味著可以從其他合約和交易中呼叫它們。external
函式f不能在內部呼叫(即f()不起作用,但this.f()起作用)。當外部函式接收大量資料時,它們有時會更有效。 -
public
:公共函式是智慧合約介面的一部分,可以在內部呼叫,也可以透過訊息呼叫。對於公共狀態變數,會生成自動getter函式(見下文)。 -
internal
:這些函式和狀態變數只能在內部訪問(即從當前合約或從中派生的合約中),而其他情況不使用它。 -
private
:私有函式和狀態變數僅對定義它們的智慧合約可見,而不是在派生合約中可見。
下面是我們的第二份智慧合約:
pragma solidity ^0.4.11;/** * @title Destructible * @dev Base contract that can be destroyed by owner. All funds in contract will be sent to the owner. */contract Destructible is Ownable { function Destructible() payable { } /** * @dev Transfers the current balance to the owner and terminates the contract. */ function destroy() onlyOwner { selfdestruct(owner); } function destroyAndSend(address _recipient) onlyOwner { selfdestruct(_recipient); } }
現在使用這兩個基本合約,我們將寫一個簡單的
BankAccount
智慧合約,人們可以匯款,業主可以提取。
pragma solidity ^0.4.11; contract BankAccount is Ownable, Destructible { function store() public payable { } function withdraw(uint amount) public onlyOwner { if (this.balance >= amount) { msg.sender.transfer(amount); } } }
請注意,我們需要從兩個智慧合約繼承。繼承的順序很重要。判斷順序的一個簡單規則是按照“最類似基類”到“最多派生”的順序指定基類。
以下是我們將部署的整個程式碼:
pragma solidity ^0.4.11;/** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */contract Ownable { address public owner; /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function Ownable() { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) onlyOwner { require(newOwner != address(0)); owner = newOwner; } }/** * @title Destructible * @dev Base contract that can be destroyed by owner. All funds in contract will be sent to the owner. */contract Destructible is Ownable { function Destructible() payable { } /** * @dev Transfers the current balance to the owner and terminates the contract. */ function destroy() onlyOwner { selfdestruct(owner); } function destroyAndSend(address _recipient) onlyOwner { selfdestruct(_recipient); } } contract BankAccount is Ownable, Destructible { function store() public payable { } function withdraw(uint amount) public onlyOwner { if (this.balance >= amount) { msg.sender.transfer(amount); } } }
我們現在可以部署我們的銀行賬戶
bank account
智慧合約了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557424/viewspace-2221477/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 以太坊Solidity程式語言開發框架————4、編譯合約Solid框架編譯
- 以太坊Solidity程式語言開發框架————7、合約互動Solid框架
- 以太坊Solidity程式語言開發框架————8、測試合約Solid框架
- eth以太坊智慧合約交易平臺開發
- 以太坊智慧合約開發第二篇:理解以太坊相關概念
- 以太坊蜜罐智慧合約分析
- 以太坊智慧合約開發第四篇:實現Hello World智慧合約
- 以太坊智慧合約開發第六篇:truffle開發框架框架
- 如何打造安全的以太坊智慧合約
- 以太坊智慧合約升級策略
- 以太坊智慧合約-猜數字
- 以太坊智慧合約開發第七篇:智慧合約與網頁互動網頁
- 以太坊智慧合約開發第五篇:字串拼接—Solidity字串Solid
- 以太坊中如何獲取另外一個智慧合約部署的合約地址?
- 以太坊智慧合約gas如何估計?
- 以太坊智慧合約call注入攻擊
- Polygon馬蹄鏈在以太坊上的智慧合約開發應用Go
- 技術工坊|深度探索以太坊智慧合約(深圳)
- 智慧合約開發(3)—— 以太坊虛擬機器(EVM)基礎虛擬機
- Conflux與以太坊合約開發工具區別UX
- 區塊鏈——以太坊、智慧合約簡介區塊鏈
- 以太坊智慧合約 Hexagon 存在溢位漏洞Go
- 以太坊智慧合約開發環境搭建以及第一個Dapp開發環境APP
- 以太坊開發實戰學習-合約安全(八)
- 以太坊Solidity程式語言開發框架————5、移植Solid框架
- 什麼是以太坊?什麼是智慧合約?
- 使用Remix編譯和部署以太坊智慧合約REM編譯
- 以太坊智慧合約開發第三篇:安裝節點工具Ganache
- 用solidity語言開發代幣智慧合約Solid
- 以太坊Solidity程式語言開發框架————9、控制檯Solid框架
- 區塊鏈2.0以太坊智慧合約solidity之helloworld區塊鏈Solid
- 使用truffle部署以太坊智慧合約到區塊鏈區塊鏈
- 【精通以太坊】——第九章 智慧合約安全
- 以太坊Solidity程式語言開發框架————12、聯絡開發者Solid框架
- 以太坊Solidity程式語言開發框架————1、Truffle簡介Solid框架
- 以太坊Solidity程式語言開發框架————10、外部指令碼Solid框架指令碼
- 以太坊Solidity程式語言開發框架————11、工作流Solid框架
- 以太坊Solidity程式語言開發框架————13、配置檔案Solid框架