咱們寫了一份小的計算合約做爲Hello World。若是咱們能夠建立一個容許用戶建立本身的計數器的合約怎麼辦?php
讓咱們建立咱們的合約CounterFactory
,它將管理全部其餘計數器Counters
。它將包含一個映射,將全部者與其計數器合約的地址相關聯。java
mapping(address => address) counters;
複製代碼
當用戶想要使用咱們的計數器系統來擁有他本身的計數器時,他將須要請求建立他的計數器。node
function createCounter() public {
if (counters[msg.sender] == 0) {
counters[msg.sender] = new Counter(msg.sender);
}
}
複製代碼
請注意,咱們將構造函數的地址傳遞給構造函數,所以咱們將轉移調用者的全部權。在新智能合約的構造函數中,msg.sender
將引用咱們的合約工廠的地址。這是一個很是重要的要點,由於使用合約與其餘合約進行交互是一種常見作法。所以,你應該在複雜的狀況下照顧誰是發件人。python
如今是增量函數,咱們首先檢查用戶是否已經註冊了智能合約並從合約中調用增量函數。因爲映射存儲了智能的地址,咱們須要將地址轉換爲Counter
合約類型。存儲合約的地址而不是直接引用智能合約容許咱們經過使用空地址檢查合約是否已初始化:0或0x0 ..android
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()
函數,這樣合約的初始建立者能夠得到一些收入來完成他的工做。咱們還可讓原始建立者刪除計數器,或將合約與字符串或數字相關聯。web
對Counter
合約進行了簡單編輯,以適應做爲參數傳遞的新地址。mongodb
這是完整的代碼:編程
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庫來防止這種狀況。bash
要部署咱們的智能合約,您須要提供CounterFactory
和Counter
的代碼。部署時,你須要選擇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智能合約