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框架
- 用solidity語言開發代幣智慧合約Solid
- eth以太坊智慧合約交易平臺開發
- 以太坊智慧合約開發第四篇:實現Hello World智慧合約
- SWP智慧合約語言系統技術開發搭建
- 以太坊智慧合約開發第六篇:truffle開發框架框架
- 以太坊智慧合約開發第七篇:智慧合約與網頁互動網頁
- 以太坊智慧合約開發第二篇:理解以太坊相關概念
- 以太坊中如何獲取另外一個智慧合約部署的合約地址?
- 太坊智慧合約開發第一篇:IDE對solidity語法的支援IDESolid
- 以太坊蜜罐智慧合約分析
- 如何打造安全的以太坊智慧合約
- Polygon馬蹄鏈在以太坊上的智慧合約開發應用Go
- 智慧合約從入門到精通:Solidity語言的開發規範和開發流程Solid
- 智慧合約開發(3)—— 以太坊虛擬機器(EVM)基礎虛擬機
- 以太坊智慧合約開發第五篇:字串拼接—Solidity字串Solid
- 以太坊智慧合約升級策略
- 以太坊智慧合約-猜數字
- JavaScript中的繼承和組合JavaScript繼承
- Java中的繼承與組合Java繼承
- 合約量化系統開發(Python語言)丨合約量化開發(原始碼專案)Python原始碼
- 中移鏈合約常用開發介紹(三)工程化開發智慧合約
- 合約量化系統開發(語言)python|合約量化模式詳情分析Python模式
- 以太坊智慧合約gas如何估計?
- 以太坊智慧合約call注入攻擊
- merrill智慧AI合約量化交易系統開發/python技術語言AIPython
- 智慧合約開發神器-RemixREM
- 以太坊智慧合約開發環境搭建以及第一個Dapp開發環境APP
- 以太坊智慧合約開發第三篇:安裝節點工具Ganache
- C語言實現繼承多型C語言繼承多型
- 以太坊開發實戰學習-合約安全(八)
- SET智慧合約量化系統開發|秒合約量化開發搭建
- 以太坊智慧合約 Hexagon 存在溢位漏洞Go
- 區塊鏈——以太坊、智慧合約簡介區塊鏈
- 智慧合約從入門到精通:Solidity組合語言Solid組合語言