咱們寫了一份小的計算合約做爲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庫來防止這種狀況。app
要部署咱們的智能合約,您須要提供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的以太坊應用,包括帳戶管理、狀態與交易、智能合約開發與交互、過濾器和交易等。