资讯专栏INFORMATION COLUMN

工厂模式管理多个以太坊solidity智能合约

leone / 2490人阅读

摘要:在新智能合约的构造函数中,将引用我们的合约工厂的地址。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。以太坊入门教程,主要介绍智能合约与应用开发,适合入门。这里是原文用工厂模式管理多个智能合约

我们写了一份小的计算合约作为Hello World。如果我们可以创建一个允许用户创建自己的计数器的合约怎么办?

让我们创建我们的合约CounterFactory,它将管理所有其他计数器Counters。它将包含一个映射,将所有者与其计数器合约的地址相关联。

mapping(address => address) counters;

当用户想要使用我们的计数器系统来拥有他自己的计数器时,他将需要请求创建他的计数器。

function createCounter() public {
    if (counters[msg.sender] == 0) {
       counters[msg.sender] = new Counter(msg.sender);
    }
}

请注意,我们将构造函数的地址传递给构造函数,因此我们将转移调用者的所有权。在新智能合约的构造函数中,msg.sender将引用我们的合约工厂的地址。这是一个非常重要的要点,因为使用合约与其他合约进行交互是一种常见做法。因此,你应该在复杂的情况下照顾谁是发件人。

现在是增量函数,我们首先检查用户是否已经注册了智能合约并从合约中调用增量函数。由于映射存储了智能的地址,我们需要将地址转换为Counter合约类型。存储合约的地址而不是直接引用智能合约允许我们通过使用空地址检查合约是否已初始化:0或0x0 ..

function increment() public {
   require (counters[msg.sender] != 0);
   Counter(counters[msg.sender]).increment(msg.sender);
}

最后,为了读取计数器的值,我们将用户的地址作为参数来获取计数器的值。

function getCount(address account) public constant returns (uint) {
   if (counters[account] != 0) {
       return (Counter(counters[account]).getCount());
    }
}

在这个例子中,我们保持简单但你可以想象几个场景,例如需要将Ether发送到createCounter()函数,这样合约的初始创建者可以获得一些收入来完成他的工作。我们还可以让原始创建者删除计数器,或将合约与字符串或数字相关联。

Counter合约进行了简单编辑,以适应作为参数传递的新地址。

这是完整的代码:

pragma solidity ^0.4.11;

contract Counter {

    address owner;
    address factory;
    uint count = 0;

    function Counter(address _owner) {
        owner = _owner;
        factory = msg.sender
    }

    modifier isOwner(address _caller) {
        require(msg.sender == factory);
        require(_caller == owner);
        _;
    }
    
    function increment(address caller) public isOwner(caller) {
       count = count + 1;
    }

    function getCount() constant returns (uint) {
       return count;
    }

}

contract CounterFactory {
 
    mapping(address => address) counters;

    function createCounter() public {
        if (counters[msg.sender] == 0) {
            counters[msg.sender] = new Counter(msg.sender);
        }
    }
    
    function increment() public {
        require (counters[msg.sender] != 0);
        Counter(counters[msg.sender]).increment(msg.sender);
    }
    
    function getCount(address account) public constant returns (uint) {
        if (counters[account] != 0) {
            return (Counter(counters[account]).getCount());
        }
    }

 
}

请注意,如果多次调用,我们的计数器可能会成为溢出的受害者。你应尽可能使用SafeMath库来防止这种情况。

要部署我们的智能合约,您需要提供CounterFactoryCounter的代码。部署时,你需要选择CounterFactory

从你的一个帐户执行createCounter()函数并在合约界面的阅读部分调用increment()函数后,你需要将帐户的地址设置为读取计数器的值。你现在可以为每个帐户设置一个计数器。

在下一个教程中,我们将看到如何使用继承来保持干净的代码并重用现有的和经过测试的区块。

======================================================================

分享一些以太坊、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/24391.html

相关文章

  • solidity语言开发智能合约中的继承

    摘要:你首先编写基本智能合约并告知你的新智能合约将从基础合约继承。这些函数和状态变量只能在内部访问即从当前合约或从中派生的合约中,而其他情况不使用它。私有函数和状态变量仅对定义它们的智能合约可见,而不是在派生合约中可见。这里是原文语言开发中的继承 我们已经探索了很多主题,在编写智能合约时我们发现经常使用相同的模式:例如,智能合约具有在构造函数中设置的所有者,然后生成修改器以便仅让所有者使用一...

    lifesimple 评论0 收藏0
  • 以太是什么 - 以太开发入门指南

    摘要:以太坊是什么以太坊是一个建立在区块链技术之上,去中心化应用平台。运行环境以太坊虚拟机是以太坊中智能合约的运行环境。是由以太坊客户端提供的是典型的开发以太坊时使用的客户端,基于语言开发。 本文首发于深入浅出区块链社区原文链接:以太坊是什么 - 以太坊开发入门指南原文已更新,请读者前往原文阅读 很多同学已经跃跃欲试投入到区块链开发队伍当中来,可是又感觉无从下手,本文将基于以太坊平台,以通俗...

    tomlingtm 评论0 收藏0
  • SegmentFault 技术周刊 Vol.41 - 深入学习区块链

    摘要:和比特币协议有所不同的是,以太坊的设计十分灵活,极具适应性。超级账本区块链的商业应用超级账本超级账本是基金会下的众多项目中的一个。证书颁发机构负责签发撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 从比特币开始 一个故事告诉你比特币的原理及运作机制 这篇文章的定位会比较科普,尽量用类比的方法将比特币的基本原理讲出来...

    qianfeng 评论0 收藏0
  • 以太:Dapp及相关开发工具介绍

    摘要:邮件列表以太坊上的开发者邮件列表停止使用。开发的移动以太坊浏览器开发阶段由支持的浏览器内。是以太坊的开发环境,测试框架和资产管道。审查随机数以太坊虚拟机是以太坊智能合约的执行环境。 去中心化应用去中心化应用是可以使用户和供应商之间直接互动的服务(例如,连接某些市场上的买方和卖方,文件存储里的持有者和储存者)。以太坊去中心化应用典型地通过HTML/Javascript网络应用与用户互动,...

    FleyX 评论0 收藏0
  • 2018以太智能合约编程语言solidity的最佳IDEs

    摘要:使用基于以太坊的智能合约的集成开发环境。以太坊教程,主要介绍智能合约与应用开发,适合入门。以太坊,主要是介绍使用进行智能合约开发交互,进行账号创建交易转账代币开发以及过滤器和事件等内容。 Solidity是一种以智能合约为导向的编程语言。这是一种只有四年的年轻语言,旨在帮助开发基于以太坊数字货币的智能合约。 理解它官方文档应该是学习Solidity的最佳来源:solidity.read...

    darkerXi 评论0 收藏0

发表评论

0条评论

leone

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<