摘要:你首先编写基本智能合约并告知你的新智能合约将从基础合约继承。这些函数和状态变量只能在内部访问即从当前合约或从中派生的合约中,而其他情况不使用它。私有函数和状态变量仅对定义它们的智能合约可见,而不是在派生合约中可见。这里是原文语言开发中的继承
我们已经探索了很多主题,在编写智能合约时我们发现经常使用相同的模式:例如,智能合约具有在构造函数中设置的所有者,然后生成修改器以便仅让所有者使用一些功能。如果我们制定实施这些功能的基础合约并在未来的智能合约中重复使用它们那该怎么办?你一定猜得到,我们将使用继承。
在Solidity中,继承与经典的面向对象编程语言非常相似。你首先编写基本智能合约并告知你的新智能合约将从基础合约继承。
你还必须通过复制包含多态的代码来了解Solidity支持多重继承。所有函数调用都是虚函数,这意味着会是调用派生函数最多的函数,除非明确给出了合约名称。当某一个智能合约从多个合约继承时,只在区块链上创建一个智能合约,并将所有基础合约中的代码复制到创建的智能合约中。
让我们写下我们的基本智能合约:它将让我们轻松地为我们的合约添加所有权。我们将其命名为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; } }
我们经常写的另一种模式是破坏我们的合约并将合约中存储的资金转移给所有者或另一个地址的能力。重要的是我们不希望任何人能够破坏我们的合约,所以我们的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智能合约了。
部署后,我们可以看到我们看到了我们的银行帐户功能,但也看到了继承的功能。
======================================================================
分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:
java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。
这里是原文solidity语言开发中的继承
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/24392.html
摘要:地址类型的成员属性及函数这里是地址类型相关成员的快速索引用来查询账户余额,用来发送以太币以为单位。因此,为了保证安全,必须检查的返回值,如果交易失败,会回退以太币。 本文首发于深入浅出区块链社区原文链接:智能合约语言 Solidity 教程系列2 - 地址类型介绍原文已更新,请读者前往原文阅读 Solidity教程系列第二篇 - Solidity地址类型介绍. Solidity 系列完...
摘要:本文首发于深入浅出区块链社区原文链接智能合约语言教程系列完全理解函数修改器原文已更新,请读者前往原文阅读这是教程系列文章第篇,带大家完全理解的函数修改器。在此上下文中,所有的函数中引入的符号,在修改器中均可见。 本文首发于深入浅出区块链社区原文链接:智能合约语言 Solidity 教程系列10 - 完全理解函数修改器原文已更新,请读者前往原文阅读 这是Solidity教程系列文章第10...
摘要:本文首发于深入浅出区块链社区原文链接智能合约语言教程系列函数类型原文已更新,请读者前往原文阅读教程系列第三篇函数类型介绍。函数类型函数也是一种类型,且属于值类型。但以此相反,合约中函数本身默认是的,仅仅是当作类型名使用时默认是的。 本文首发于深入浅出区块链社区原文链接:智能合约语言Solidity教程系列3 - 函数类型原文已更新,请读者前往原文阅读 Solidity 教程系列第三篇 ...
摘要:第一个例子,在你把智能协议传上以太坊之后,它就变得不可更改这种永固性意味着你的代码永远不能被调整或更新。允许将合约所有权转让给他人。为何要来驱动以太坊就像一个巨大缓慢但非常安全的电脑。 通过前边的 Solidity 基础语法学习,我们已经有了Solidity编程经验,在这节就要学学 Ethereum 开发的技术细节,编写真正的 DApp 时必知的:智能协议的所有权,Gas的花费,代码优...
摘要:在新智能合约的构造函数中,将引用我们的合约工厂的地址。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。以太坊入门教程,主要介绍智能合约与应用开发,适合入门。这里是原文用工厂模式管理多个智能合约 我们写了一份小的计算合约作为Hello World。如果我们可以创建一个允许用户创建自己的计数器的合约怎么办? showImg(https://segmentfault.com/img/...
阅读 1870·2021-11-25 09:43
阅读 3159·2021-11-15 11:38
阅读 2707·2019-08-30 13:04
阅读 482·2019-08-29 11:07
阅读 1491·2019-08-26 18:37
阅读 2695·2019-08-26 14:07
阅读 580·2019-08-26 13:52
阅读 2276·2019-08-26 12:09