我們寫了一份小的計(jì)算合約作為Hello World。如果我們可以創(chuàng)建一個(gè)允許用戶創(chuàng)建自己的計(jì)數(shù)器的合約怎么辦?
讓我們創(chuàng)建我們的合約CounterFactory
净嘀,它將管理所有其他計(jì)數(shù)器Counters
狂魔。它將包含一個(gè)映射,將所有者與其計(jì)數(shù)器合約的地址相關(guān)聯(lián)凌彬。
mapping(address => address) counters;
當(dāng)用戶想要使用我們的計(jì)數(shù)器系統(tǒng)來?yè)碛兴约旱挠?jì)數(shù)器時(shí)沸柔,他將需要請(qǐng)求創(chuàng)建他的計(jì)數(shù)器。
function createCounter() public {
if (counters[msg.sender] == 0) {
counters[msg.sender] = new Counter(msg.sender);
}
}
請(qǐng)注意铲敛,我們將構(gòu)造函數(shù)的地址傳遞給構(gòu)造函數(shù)褐澎,因此我們將轉(zhuǎn)移調(diào)用者的所有權(quán)。在新智能合約的構(gòu)造函數(shù)中伐蒋,msg.sender
將引用我們的合約工廠的地址工三。這是一個(gè)非常重要的要點(diǎn),因?yàn)槭褂煤霞s與其他合約進(jìn)行交互是一種常見做法先鱼。因此俭正,你應(yīng)該在復(fù)雜的情況下照顧誰(shuí)是發(fā)件人。
現(xiàn)在是增量函數(shù)焙畔,我們首先檢查用戶是否已經(jīng)注冊(cè)了智能合約并從合約中調(diào)用增量函數(shù)掸读。由于映射存儲(chǔ)了智能的地址,我們需要將地址轉(zhuǎn)換為Counter
合約類型闹蒜。存儲(chǔ)合約的地址而不是直接引用智能合約允許我們通過使用空地址檢查合約是否已初始化:0或0x0 ..
function increment() public {
require (counters[msg.sender] != 0);
Counter(counters[msg.sender]).increment(msg.sender);
}
最后寺枉,為了讀取計(jì)數(shù)器的值,我們將用戶的地址作為參數(shù)來獲取計(jì)數(shù)器的值绷落。
function getCount(address account) public constant returns (uint) {
if (counters[account] != 0) {
return (Counter(counters[account]).getCount());
}
}
在這個(gè)例子中姥闪,我們保持簡(jiǎn)單但你可以想象幾個(gè)場(chǎng)景,例如需要將Ether發(fā)送到createCounter()
函數(shù)砌烁,這樣合約的初始創(chuàng)建者可以獲得一些收入來完成他的工作筐喳。我們還可以讓原始創(chuàng)建者刪除計(jì)數(shù)器催式,或?qū)⒑霞s與字符串或數(shù)字相關(guān)聯(lián)。
對(duì)Counter
合約進(jìn)行了簡(jiǎn)單編輯避归,以適應(yīng)作為參數(shù)傳遞的新地址荣月。
這是完整的代碼:
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());
}
}
}
請(qǐng)注意,如果多次調(diào)用梳毙,我們的計(jì)數(shù)器可能會(huì)成為溢出的受害者哺窄。你應(yīng)盡可能使用SafeMath庫(kù)來防止這種情況。
要部署我們的智能合約账锹,您需要提供CounterFactory
和Counter
的代碼萌业。部署時(shí),你需要選擇CounterFactory
奸柬。
從你的一個(gè)帳戶執(zhí)行createCounter()
函數(shù)并在合約界面的閱讀部分調(diào)用increment()
函數(shù)后生年,你需要將帳戶的地址設(shè)置為讀取計(jì)數(shù)器的值。你現(xiàn)在可以為每個(gè)帳戶設(shè)置一個(gè)計(jì)數(shù)器廓奕。
在下一個(gè)教程中抱婉,我們將看到如何使用繼承來保持干凈的代碼并重用現(xiàn)有的和經(jīng)過測(cè)試的區(qū)塊。
======================================================================
分享一些以太坊桌粉、EOS蒸绩、比特幣等區(qū)塊鏈相關(guān)的交互式在線編程實(shí)戰(zhàn)教程:
- java以太坊開發(fā)教程,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開發(fā)的web3j詳解番甩。
- python以太坊侵贵,主要是針對(duì)python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。
- php以太坊缘薛,主要是介紹使用php進(jìn)行智能合約開發(fā)交互窍育,進(jìn)行賬號(hào)創(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ā)與部署会通、使用代碼與智能合約交互等核心知識(shí)點(diǎn),最后綜合運(yùn)用各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開發(fā)娄周。
- java比特幣開發(fā)教程,本課程面向初學(xué)者沪停,內(nèi)容即涵蓋比特幣的核心概念煤辨,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制木张、密鑰與腳本众辨、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Java代碼中集成比特幣支持功能舷礼,例如創(chuàng)建地址鹃彻、管理錢包、構(gòu)造裸交易等妻献,是Java工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程蛛株。
- php比特幣開發(fā)教程,本課程面向初學(xué)者育拨,內(nèi)容即涵蓋比特幣的核心概念谨履,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制熬丧、密鑰與腳本笋粟、交易與UTXO等,同時(shí)也詳細(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)庫(kù)等疮跑,也包括代幣發(fā)行等豐富的實(shí)操代碼组贺,是go語(yǔ)言工程師快速入門區(qū)塊鏈開發(fā)的最佳選擇。
匯智網(wǎng)原創(chuàng)翻譯祖娘,轉(zhuǎn)載請(qǐng)標(biāo)明出處失尖。這里是原文用工廠模式管理多個(gè)solidity智能合約