摘要:在新智能合約的構(gòu)造函數(shù)中,將引用我們的合約工廠的地址。以太坊,主要是針對工程師使用進行區(qū)塊鏈以太坊開發(fā)的詳解。以太坊入門教程,主要介紹智能合約與應(yīng)用開發(fā),適合入門。這里是原文用工廠模式管理多個智能合約
我們寫了一份小的計算合約作為Hello World。如果我們可以創(chuàng)建一個允許用戶創(chuàng)建自己的計數(shù)器的合約怎么辦?
讓我們創(chuàng)建我們的合約CounterFactory,它將管理所有其他計數(shù)器Counters。它將包含一個映射,將所有者與其計數(shù)器合約的地址相關(guān)聯(lián)。
mapping(address => address) counters;
當(dāng)用戶想要使用我們的計數(shù)器系統(tǒng)來擁有他自己的計數(shù)器時,他將需要請求創(chuàng)建他的計數(shù)器。
function createCounter() public { if (counters[msg.sender] == 0) { counters[msg.sender] = new Counter(msg.sender); } }
請注意,我們將構(gòu)造函數(shù)的地址傳遞給構(gòu)造函數(shù),因此我們將轉(zhuǎn)移調(diào)用者的所有權(quán)。在新智能合約的構(gòu)造函數(shù)中,msg.sender將引用我們的合約工廠的地址。這是一個非常重要的要點,因為使用合約與其他合約進行交互是一種常見做法。因此,你應(yīng)該在復(fù)雜的情況下照顧誰是發(fā)件人。
現(xiàn)在是增量函數(shù),我們首先檢查用戶是否已經(jīng)注冊了智能合約并從合約中調(diào)用增量函數(shù)。由于映射存儲了智能的地址,我們需要將地址轉(zhuǎn)換為Counter合約類型。存儲合約的地址而不是直接引用智能合約允許我們通過使用空地址檢查合約是否已初始化:0或0x0 ..
function increment() public { require (counters[msg.sender] != 0); Counter(counters[msg.sender]).increment(msg.sender); }
最后,為了讀取計數(shù)器的值,我們將用戶的地址作為參數(shù)來獲取計數(shù)器的值。
function getCount(address account) public constant returns (uint) { if (counters[account] != 0) { return (Counter(counters[account]).getCount()); } }
在這個例子中,我們保持簡單但你可以想象幾個場景,例如需要將Ether發(fā)送到createCounter()函數(shù),這樣合約的初始創(chuàng)建者可以獲得一些收入來完成他的工作。我們還可以讓原始創(chuàng)建者刪除計數(shù)器,或?qū)⒑霞s與字符串或數(shù)字相關(guān)聯(lián)。
對Counter合約進行了簡單編輯,以適應(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()); } } }
請注意,如果多次調(diào)用,我們的計數(shù)器可能會成為溢出的受害者。你應(yīng)盡可能使用SafeMath庫來防止這種情況。
要部署我們的智能合約,您需要提供CounterFactory和Counter的代碼。部署時,你需要選擇CounterFactory。
從你的一個帳戶執(zhí)行createCounter()函數(shù)并在合約界面的閱讀部分調(diào)用increment()函數(shù)后,你需要將帳戶的地址設(shè)置為讀取計數(shù)器的值。你現(xiàn)在可以為每個帳戶設(shè)置一個計數(shù)器。
在下一個教程中,我們將看到如何使用繼承來保持干凈的代碼并重用現(xiàn)有的和經(jīng)過測試的區(qū)塊。
======================================================================
分享一些以太坊、EOS、比特幣等區(qū)塊鏈相關(guān)的交互式在線編程實戰(zhàn)教程:
java以太坊開發(fā)教程,主要是針對java和android程序員進行區(qū)塊鏈以太坊開發(fā)的web3j詳解。
python以太坊,主要是針對python工程師使用web3.py進行區(qū)塊鏈以太坊開發(fā)的詳解。
php以太坊,主要是介紹使用php進行智能合約開發(fā)交互,進行賬號創(chuàng)建、交易、轉(zhuǎn)賬、代幣開發(fā)以及過濾器和交易等內(nèi)容。
以太坊入門教程,主要介紹智能合約與dapp應(yīng)用開發(fā),適合入門。
以太坊開發(fā)進階教程,主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實現(xiàn)去中心化電商DApp實戰(zhàn),適合進階。
C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應(yīng)用,包括賬戶管理、狀態(tài)與交易、智能合約開發(fā)與交互、過濾器和交易等。
EOS教程,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應(yīng)用的開發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢包、發(fā)行代幣、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識點,最后綜合運用各知識點完成一個便簽DApp的開發(fā)。
java比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Java工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。
php比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。
tendermint區(qū)塊鏈開發(fā)詳解,本課程適合希望使用tendermint進行區(qū)塊鏈開發(fā)的工程師,課程內(nèi)容即包括tendermint應(yīng)用開發(fā)模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態(tài)庫等,也包括代幣發(fā)行等豐富的實操代碼,是go語言工程師快速入門區(qū)塊鏈開發(fā)的最佳選擇。
這里是原文用工廠模式管理多個solidity智能合約
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24391.html
摘要:你首先編寫基本智能合約并告知你的新智能合約將從基礎(chǔ)合約繼承。這些函數(shù)和狀態(tài)變量只能在內(nèi)部訪問即從當(dāng)前合約或從中派生的合約中,而其他情況不使用它。私有函數(shù)和狀態(tài)變量僅對定義它們的智能合約可見,而不是在派生合約中可見。這里是原文語言開發(fā)中的繼承 我們已經(jīng)探索了很多主題,在編寫智能合約時我們發(fā)現(xiàn)經(jīng)常使用相同的模式:例如,智能合約具有在構(gòu)造函數(shù)中設(shè)置的所有者,然后生成修改器以便僅讓所有者使用一...
摘要:以太坊是什么以太坊是一個建立在區(qū)塊鏈技術(shù)之上,去中心化應(yīng)用平臺。運行環(huán)境以太坊虛擬機是以太坊中智能合約的運行環(huán)境。是由以太坊客戶端提供的是典型的開發(fā)以太坊時使用的客戶端,基于語言開發(fā)。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:以太坊是什么 - 以太坊開發(fā)入門指南原文已更新,請讀者前往原文閱讀 很多同學(xué)已經(jīng)躍躍欲試投入到區(qū)塊鏈開發(fā)隊伍當(dāng)中來,可是又感覺無從下手,本文將基于以太坊平臺,以通俗...
摘要:和比特幣協(xié)議有所不同的是,以太坊的設(shè)計十分靈活,極具適應(yīng)性。超級賬本區(qū)塊鏈的商業(yè)應(yīng)用超級賬本超級賬本是基金會下的眾多項目中的一個。證書頒發(fā)機構(gòu)負責(zé)簽發(fā)撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 從比特幣開始 一個故事告訴你比特幣的原理及運作機制 這篇文章的定位會比較科普,盡量用類比的方法將比特幣的基本原理講出來...
摘要:郵件列表以太坊上的開發(fā)者郵件列表停止使用。開發(fā)的移動以太坊瀏覽器開發(fā)階段由支持的瀏覽器內(nèi)。是以太坊的開發(fā)環(huán)境,測試框架和資產(chǎn)管道。審查隨機數(shù)以太坊虛擬機是以太坊智能合約的執(zhí)行環(huán)境。 去中心化應(yīng)用去中心化應(yīng)用是可以使用戶和供應(yīng)商之間直接互動的服務(wù)(例如,連接某些市場上的買方和賣方,文件存儲里的持有者和儲存者)。以太坊去中心化應(yīng)用典型地通過HTML/Javascript網(wǎng)絡(luò)應(yīng)用與用戶互動,...
摘要:使用基于以太坊的智能合約的集成開發(fā)環(huán)境。以太坊教程,主要介紹智能合約與應(yīng)用開發(fā),適合入門。以太坊,主要是介紹使用進行智能合約開發(fā)交互,進行賬號創(chuàng)建交易轉(zhuǎn)賬代幣開發(fā)以及過濾器和事件等內(nèi)容。 Solidity是一種以智能合約為導(dǎo)向的編程語言。這是一種只有四年的年輕語言,旨在幫助開發(fā)基于以太坊數(shù)字貨幣的智能合約。 理解它官方文檔應(yīng)該是學(xué)習(xí)Solidity的最佳來源:solidity.read...
閱讀 3092·2021-09-22 15:20
閱讀 2610·2019-08-30 15:54
閱讀 1975·2019-08-30 14:06
閱讀 3122·2019-08-30 13:05
閱讀 2467·2019-08-29 18:36
閱讀 580·2019-08-29 15:10
閱讀 533·2019-08-29 11:17
閱讀 833·2019-08-28 18:11