摘要:你首先編寫基本智能合約并告知你的新智能合約將從基礎(chǔ)合約繼承。這些函數(shù)和狀態(tài)變量只能在內(nèi)部訪問即從當(dāng)前合約或從中派生的合約中,而其他情況不使用它。私有函數(shù)和狀態(tài)變量僅對定義它們的智能合約可見,而不是在派生合約中可見。這里是原文語言開發(fā)中的繼承
我們已經(jīng)探索了很多主題,在編寫智能合約時我們發(fā)現(xiàn)經(jīng)常使用相同的模式:例如,智能合約具有在構(gòu)造函數(shù)中設(shè)置的所有者,然后生成修改器以便僅讓所有者使用一些功能。如果我們制定實(shí)施這些功能的基礎(chǔ)合約并在未來的智能合約中重復(fù)使用它們那該怎么辦?你一定猜得到,我們將使用繼承。
在Solidity中,繼承與經(jīng)典的面向?qū)ο缶幊陶Z言非常相似。你首先編寫基本智能合約并告知你的新智能合約將從基礎(chǔ)合約繼承。
你還必須通過復(fù)制包含多態(tài)的代碼來了解Solidity支持多重繼承。所有函數(shù)調(diào)用都是虛函數(shù),這意味著會是調(diào)用派生函數(shù)最多的函數(shù),除非明確給出了合約名稱。當(dāng)某一個智能合約從多個合約繼承時,只在區(qū)塊鏈上創(chuàng)建一個智能合約,并將所有基礎(chǔ)合約中的代碼復(fù)制到創(chuàng)建的智能合約中。
讓我們寫下我們的基本智能合約:它將讓我們輕松地為我們的合約添加所有權(quán)。我們將其命名為Ownable。OpenZeppelin的員工寫了很多可以在智能合約中使用的可重用代碼。這些代碼段可通過其工具或其Github存儲庫獲得。
這是代碼:
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; } }
我們經(jīng)常寫的另一種模式是破壞我們的合約并將合約中存儲的資金轉(zhuǎn)移給所有者或另一個地址的能力。重要的是我們不希望任何人能夠破壞我們的合約,所以我們的Destructible應(yīng)該繼承Ownable。繼承是使用智能合約名稱后面的is關(guān)鍵字完成的。
必須注意,它是Solidity,默認(rèn)情況下是函數(shù),或者可以從派生類訪問。與其他編程語言一樣,你可以指定從外部或派生合約中可以訪問的內(nèi)容。函數(shù)可以指定為external,public,internal,private,默認(rèn)為public。
external:外部函數(shù)是智能合約接口的一部分,這意味著可以從其他合約和交易中調(diào)用它們。external函數(shù)f不能在內(nèi)部調(diào)用(即f()不起作用,但this.f()起作用)。當(dāng)外部函數(shù)接收大量數(shù)據(jù)時,它們有時會更有效。
public:公共函數(shù)是智能合約接口的一部分,可以在內(nèi)部調(diào)用,也可以通過消息調(diào)用。對于公共狀態(tài)變量,會生成自動getter函數(shù)(見下文)。
internal:這些函數(shù)和狀態(tài)變量只能在內(nèi)部訪問(即從當(dāng)前合約或從中派生的合約中),而其他情況不使用它。
private:私有函數(shù)和狀態(tài)變量僅對定義它們的智能合約可見,而不是在派生合約中可見。
下面是我們的第二份智能合約:
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); } }
現(xiàn)在使用這兩個基本合約,我們將寫一個簡單的BankAccount智能合約,人們可以匯款,業(yè)主可以提取。
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); } } }
請注意,我們需要從兩個智能合約繼承。繼承的順序很重要。判斷順序的一個簡單規(guī)則是按照“最類似基類”到“最多派生”的順序指定基類。
以下是我們將部署的整個代碼:
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); } } }
我們現(xiàn)在可以部署我們的銀行賬戶bank account智能合約了。
部署后,我們可以看到我們看到了我們的銀行帳戶功能,但也看到了繼承的功能。
======================================================================
分享一些以太坊、EOS、比特幣等區(qū)塊鏈相關(guān)的交互式在線編程實(shí)戰(zhàn)教程:
java以太坊開發(fā)教程,主要是針對java和android程序員進(jìn)行區(qū)塊鏈以太坊開發(fā)的web3j詳解。
python以太坊,主要是針對python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。
php以太坊,主要是介紹使用php進(jìn)行智能合約開發(fā)交互,進(jìn)行賬號創(chuàng)建、交易、轉(zhuǎn)賬、代幣開發(fā)以及過濾器和交易等內(nèi)容。
以太坊入門教程,主要介紹智能合約與dapp應(yīng)用開發(fā),適合入門。
以太坊開發(fā)進(jìn)階教程,主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn),適合進(jìn)階。
C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應(yīng)用,包括賬戶管理、狀態(tài)與交易、智能合約開發(fā)與交互、過濾器和交易等。
EOS教程,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應(yīng)用的開發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢包、發(fā)行代幣、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識點(diǎn),最后綜合運(yùn)用各知識點(diǎn)完成一個便簽DApp的開發(fā)。
java比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機(jī)制、密鑰與腳本、交易與UTXO等,同時也詳細(xì)講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Java工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。
php比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機(jī)制、密鑰與腳本、交易與UTXO等,同時也詳細(xì)講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。
tendermint區(qū)塊鏈開發(fā)詳解,本課程適合希望使用tendermint進(jìn)行區(qū)塊鏈開發(fā)的工程師,課程內(nèi)容即包括tendermint應(yīng)用開發(fā)模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態(tài)庫等,也包括代幣發(fā)行等豐富的實(shí)操代碼,是go語言工程師快速入門區(qū)塊鏈開發(fā)的最佳選擇。
這里是原文solidity語言開發(fā)中的繼承
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24392.html
摘要:地址類型的成員屬性及函數(shù)這里是地址類型相關(guān)成員的快速索引用來查詢賬戶余額,用來發(fā)送以太幣以為單位。因此,為了保證安全,必須檢查的返回值,如果交易失敗,會回退以太幣。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列2 - 地址類型介紹原文已更新,請讀者前往原文閱讀 Solidity教程系列第二篇 - Solidity地址類型介紹. Solidity 系列完...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列完全理解函數(shù)修改器原文已更新,請讀者前往原文閱讀這是教程系列文章第篇,帶大家完全理解的函數(shù)修改器。在此上下文中,所有的函數(shù)中引入的符號,在修改器中均可見。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列10 - 完全理解函數(shù)修改器原文已更新,請讀者前往原文閱讀 這是Solidity教程系列文章第10...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列函數(shù)類型原文已更新,請讀者前往原文閱讀教程系列第三篇函數(shù)類型介紹。函數(shù)類型函數(shù)也是一種類型,且屬于值類型。但以此相反,合約中函數(shù)本身默認(rèn)是的,僅僅是當(dāng)作類型名使用時默認(rèn)是的。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言Solidity教程系列3 - 函數(shù)類型原文已更新,請讀者前往原文閱讀 Solidity 教程系列第三篇 ...
摘要:第一個例子,在你把智能協(xié)議傳上以太坊之后,它就變得不可更改這種永固性意味著你的代碼永遠(yuǎn)不能被調(diào)整或更新。允許將合約所有權(quán)轉(zhuǎn)讓給他人。為何要來驅(qū)動以太坊就像一個巨大緩慢但非常安全的電腦。 通過前邊的 Solidity 基礎(chǔ)語法學(xué)習(xí),我們已經(jīng)有了Solidity編程經(jīng)驗(yàn),在這節(jié)就要學(xué)學(xué) Ethereum 開發(fā)的技術(shù)細(xì)節(jié),編寫真正的 DApp 時必知的:智能協(xié)議的所有權(quán),Gas的花費(fèi),代碼優(yōu)...
摘要:在新智能合約的構(gòu)造函數(shù)中,將引用我們的合約工廠的地址。以太坊,主要是針對工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。以太坊入門教程,主要介紹智能合約與應(yīng)用開發(fā),適合入門。這里是原文用工廠模式管理多個智能合約 我們寫了一份小的計(jì)算合約作為Hello World。如果我們可以創(chuàng)建一個允許用戶創(chuàng)建自己的計(jì)數(shù)器的合約怎么辦? showImg(https://segmentfault.com/img/...
閱讀 1882·2021-11-25 09:43
閱讀 3177·2021-11-15 11:38
閱讀 2718·2019-08-30 13:04
閱讀 494·2019-08-29 11:07
閱讀 1508·2019-08-26 18:37
閱讀 2743·2019-08-26 14:07
閱讀 594·2019-08-26 13:52
閱讀 2289·2019-08-26 12:09