用工廠模式管理以太坊多個(gè)solidity智能合約

我們寫了一份小的計(jì)算合約作為Hello World。如果我們可以創(chuàng)建一個(gè)允許用戶創(chuàng)建自己的計(jì)數(shù)器的合約怎么辦?

image

讓我們創(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ù)來防止這種情況。

要部署我們的智能合約账锹,您需要提供CounterFactoryCounter的代碼萌业。部署時(shí),你需要選擇CounterFactory奸柬。

image

從你的一個(gè)帳戶執(zhí)行createCounter()函數(shù)并在合約界面的閱讀部分調(diào)用increment()函數(shù)后生年,你需要將帳戶的地址設(shè)置為讀取計(jì)數(shù)器的值。你現(xiàn)在可以為每個(gè)帳戶設(shè)置一個(gè)計(jì)數(shù)器廓奕。

image

在下一個(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智能合約

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市渐苏,隨后出現(xiàn)的幾起案子掀潮,更是在濱河造成了極大的恐慌,老刑警劉巖琼富,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仪吧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鞠眉,警方通過查閱死者的電腦和手機(jī)薯鼠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來械蹋,“玉大人出皇,你說我怎么就攤上這事』└辏” “怎么了郊艘?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)唯咬。 經(jīng)常有香客問我纱注,道長(zhǎng),這世上最難降的妖魔是什么副渴? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任奈附,我火速辦了婚禮,結(jié)果婚禮上煮剧,老公的妹妹穿的比我還像新娘斥滤。我一直安慰自己,他們只是感情好勉盅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布佑颇。 她就那樣靜靜地躺著,像睡著了一般草娜。 火紅的嫁衣襯著肌膚如雪挑胸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天宰闰,我揣著相機(jī)與錄音茬贵,去河邊找鬼簿透。 笑死,一個(gè)胖子當(dāng)著我的面吹牛解藻,可吹牛的內(nèi)容都是我干的老充。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼螟左,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼啡浊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胶背,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤巷嚣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后钳吟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廷粒,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年红且,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了评雌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡直焙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砂轻,到底是詐尸還是另有隱情奔誓,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布搔涝,位于F島的核電站厨喂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏庄呈。R本人自食惡果不足惜蜕煌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诬留。 院中可真熱鬧斜纪,春花似錦、人聲如沸文兑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绿贞。三九已至因块,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間籍铁,已是汗流浹背涡上。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工趾断, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吩愧。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓芋酌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耻警。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隔嫡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容