用solidity語言開發代幣智慧合約
智慧合約開發是以太坊程式設計的核心之一,而代幣是區塊鏈應用的關鍵環節,下面我們來用solidity語言開發一個代幣合約的例項,希望對大家有幫助。
以太坊的應用被稱為去中心化應用(DApp),DApp的開發主要包括兩大部分:
智慧合約的開發
使用者介面的開發
在本文中,我們將介紹智慧合約的開發語言solidity。
讓我們先從一個非常基礎的例子開始,不用擔心你現在還一點都不瞭解,我們將逐步瞭解到更多的細節。
contract SimpleStorage { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; } }
在Solidity中,一個合約由一組程式碼(合約的函式)和資料(合約的狀態)組成。合約位於以太坊區塊鏈上的一個特殊地址。
uint storedData; 這行程式碼宣告瞭一個狀態變數,變數名為storedData,型別為 uint (256bits無符號整數)。你可以認為它就像資料庫裡面的一個儲存單元,跟管理資料庫一樣,可以透過呼叫函式查詢和修改它。在以太坊中,通常只有合約的擁有者才能這樣做。在這個例子中,函式 set 和 get 分別用於修改和查詢變數的值。
跟很多其他語言一樣,訪問狀態變數時,不需要在前面增加 this. 這樣的字首。
這個合約還無法做很多事情(受限於以太坊的基礎設施),僅僅是允許任何人儲存一個數字。而且世界上任何一個人都可以來存取這個數字,缺少一個(可靠的)方式來保護你釋出的數字。任何人都可以呼叫set方法設定一個不同的數字覆蓋你釋出的數字。但是你的數字將會留存在區塊鏈的歷史上。稍後我們會學習如何增加一個存取限制,使得只有你才能修改這個數字。
編寫代幣合約
接下來的合約將實現一個形式最簡單的加密貨幣。任何人都可以傳送貨幣給其他人,不需要註冊使用者名稱和密碼,只要有一對以太坊的公私鑰即可。
contract Coin {//關鍵字“public”使變數能從合約外部訪問。 address public minter; mapping (address => uint) public balances;//事件讓輕客戶端能高效的對變化做出反應。 event Sent(address from, address to, uint amount);//這個建構函式的程式碼僅僅只在合約建立的時候被執行。 function Coin() { minter = msg.sender; } function mint(address receiver, uint amount) { if (msg.sender != minter) return; balances[receiver] += amount; } function send(address receiver, uint amount) { if (balances[msg.sender]這個合約引入了一些新的概念,讓我們來逐個介紹。
address public minter;`這行程式碼宣告瞭一個可公開訪問的狀態變數,型別為address。address型別的值大小為160 bits,不支援任何算術操作。適用於儲存合約的地址或其他人的公私鑰。public關鍵字會自動為其修飾的狀態變數生成訪問函式。沒有public關鍵字的變數將無法被其他合約訪問。另外只有本合約內的程式碼才能寫入。自動生成的函式如下:
function minter() returns (address) { return minter; }當然我們自己增加一個這樣的訪問函式是行不通的。編譯器會報錯,指出這個函式與一個狀態變數重名。
下一行程式碼建立了一個public的狀態變數,但是其型別更加複雜:
mapping (address => uint) public balances;該型別將一些address對映到無符號整數。mapping可以被認為是一個雜湊表,每一個可能的key對應的value被虛擬的初始化為全0.這個類比不是很嚴謹,對於一個mapping,無法獲取一個包含其所有key或者value的連結串列。所以我們得自己記著新增了哪些東西到mapping中。更好的方式是維護一個這樣的連結串列,或者使用其他更高階的資料型別。或者只在不受這個缺陷影響的場景中使用mapping,就像這個例子。在這個例子中由public關鍵字生成的訪問函式將會更加複雜,其程式碼大致如下:
function balances(address _account) returns (uint balance) { return balances[_account]; }我們可以很方便的透過這個函式查詢某個特定賬號的餘額。
event Sent(address from, address to, uint value);這行程式碼宣告瞭一個“事件”。由send函式的最後一行程式碼觸發。客戶端(服務端應用也適用)可以以很低的開銷來監聽這些由區塊鏈觸發的事件。事件觸發時,監聽者會同時接收到from,to,value這些引數值,可以方便的用於跟蹤交易。為了監聽這個事件,你可以使用如下程式碼:
Coin.Sent().watch({}, '', function(error, result) { if (!error) { console.log("Coin transfer: " + result.args.amount + " coins were sent from " + result.args.from + " to " + result.args.to + "."); console.log("Balances now:n" + "Sender: " + Coin.balances.call(result.args.from) + "Receiver: " + Coin.balances.call(result.args.to)); } }注意在客戶端中是如何呼叫自動生成的 balances 函式的。
這裡有個比較特殊的函式 Coin。它是一個建構函式,會在合約建立的時候執行,之後就無法被呼叫。它會永久得儲存合約建立者的地址。msg(以及tx和block)是一個神奇的全域性變數,它包含了一些可以被合約程式碼訪問的屬於區塊鏈的屬性。msg.sender 總是存放著當前函式的外部呼叫者的地址。
最後,真正被使用者或者其他合約呼叫,用來完成本合約功能的函式是mint和send。如果合約建立者之外的其他人呼叫mint,什麼都不會發生。而send可以被任何人(擁有一定數量的代幣)呼叫,傳送一些幣給其他人。注意,當你透過該合約傳送一些代幣到某個地址,在區塊鏈瀏覽器中查詢該地址將什麼也看不到。因為傳送代幣導致的餘額變化只儲存在該代幣合約的資料儲存中。透過事件我們可以很容易建立一個可以追蹤你的新幣交易和餘額的“區塊鏈瀏覽器”。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/854/viewspace-2800617/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 智慧合約語言 Solidity 教程系列8 - Solidity APISolidAPI
- 智慧合約語言 Solidity 教程系列8 – Solidity APISolidAPI
- DAPP智慧合約代幣預售質押挖礦系統技術開發丨Solidity語言編寫APPSolid
- DAPP代幣預售/智慧合約/NFT質押合約系統開發/Solidity編寫APPSolid
- Dapp 合約代幣系統開發智慧合約APP
- 智慧合約語言Solidity的最佳VSCode 外掛SolidVSCode
- 智慧合約從入門到精通:Solidity組合語言Solid組合語言
- Solidity語言/LP/DAPP合約代幣質押流動性挖礦系統技術開發詳情SolidAPP
- 智慧合約從入門到精通:Solidity語言的開發規範和開發流程Solid
- 以太坊Solidity程式語言開發框架————4、編譯合約Solid框架編譯
- 以太坊Solidity程式語言開發框架————7、合約互動Solid框架
- 以太坊Solidity程式語言開發框架————8、測試合約Solid框架
- 智慧合約語言 Solidity 教程系列1 – 型別介紹Solid型別
- 智慧合約語言 Solidity 教程系列9 - 錯誤處理Solid
- 分投趣fintoch系統合約開發分析(Solidity程式語言)Solid
- Defi/LP/DAPP代幣合約流動性質押挖礦系統開發/Solidity合約示例APPSolid
- 智慧合約DAPP代幣合約做市質押系統開發demoAPP
- DAPP區塊鏈公鏈代幣智慧合約質押挖礦系統開發(Solidity編寫)APP區塊鏈Solid
- Solidity語言學習筆記————32、建立合約Solid筆記
- 智慧合約語言 Solidity 教程系列10 - 完全理解函式修改器Solid函式
- SWP智慧合約語言系統技術開發搭建
- 智慧合約從入門到精通:用Solidity開發一個“Hello World”Solid
- 代幣智慧合約質押流動性挖礦分紅開發丨代幣智慧合約質押流動性挖礦分紅系統開發
- 代幣智慧合約流動性質押挖礦開發穩定版丨代幣智慧合約流動性質押挖礦系統開發方案
- DAPP代幣合約LP質押流動性挖礦系統模式開發(python語言)APP模式Python
- DAPP合約代幣燃燒挖礦系統開發丨智慧合約DAPP技術框架APP框架
- Defi代幣預售合約LP質押挖礦系統開發(智慧合約元件分析)元件
- solidity智慧合約開發工具Atom及其外掛安裝Solid
- olidity語言開發以太坊智慧合約中的繼承繼承
- DApp智慧合約鏈上盲盒代幣挖礦系統開發APP
- DAPP公鏈代幣智慧合約質押挖礦系統開發APP
- DAPP公鏈代幣質押挖礦系統開發(智慧合約)APP
- DAPP代幣智慧合約質押挖礦系統開發方案搭建APP
- IDO代幣預售智慧合約系統dapp開發技術原理APP
- solidity投票智慧合約程式碼Solid
- Solidity語言學習筆記————35、抽象合約和介面Solid筆記抽象
- 用智圖SmartX智慧合約讓你10秒發行自己的代幣
- Solidity語言學習筆記————31、智慧合約的基本檔案結構概述Solid筆記