SolidityOA幸運飛艇源碼下載概述及基本代碼展示
Solidity是靜態類型的,支持繼承,庫和復雜的用戶定義類型等功能。
您將會看到,可以創建投票,眾籌,盲目拍賣,多重簽名錢包等等的合約。
1 Solidity智能合約例子
我們從一個基礎的solidity例子開始。開始的時候,你可能看不懂每一行具體的意思,但是沒關系,我們會在後續的講解中介紹每一個細節。
pragma solidity ^0.4.0;
contract SimpleStorage {
function set(uint x) {
storedData = x;
}
function get() constant returns (uint) {
return storedData;
}
}
第一行告訴該合約用的是0.4.0版本的solidity編寫,並且這些代碼具有向上兼容性。保證不會在不同solidity編譯版本下編譯會出現不同的行為。
從Solidity角度來看,合約就是存在於以太坊區塊鏈中的一個特定地址中的代碼和數據集合。uint storedData 聲明了一個類型為 uint(256位的無符號整型)的變量,變量名稱為 storedData。你可以把它想象為數據庫中的一個字段,該字段是可以被數據庫中的方法進行查詢,修改。在以太坊中,這個字段是屬於一個合約字段。在這個例子中,該變量可以通過提供的get,set方法進行獲取或是修改。在Solidity中,訪問一個變量是不需要通過this來引用的。
這個合約很簡單,只是允許以太坊上的任何人來存儲一個數據到某個節點,同時把這個操作發布到以太坊中,當然,以太坊上的其他節點同樣可以通過調用set方法來修改你已經存儲好的值。雖然有被修改,但是對該值操作的任何歷史記錄都是保存在以太坊中的。不用擔心你的存儲記錄或是修改記錄會丟失。後面我們會將到如何對合約進行限制,只允許你一個人修改這個數據。
2 Solidity子貨幣例子
pragma solidity ^0.4.0;
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] < amount) return;
balances[msg.sender] -= amount;
balances[receiver] += amount;
Sent(msg.sender, receiver, amount);
}
}
下面的例子將實現一個簡單的加密貨幣例子。無中生幣不在是夢想,當然只有合約的創建人才有這個特權。此外,任何人只要有一個以太坊密鑰對就可以進行貨幣交易,根本不需要註冊用戶名和密碼。這個合約引入了一些新的概念,讓我們一個個都過一遍。
address public minter;
聲明了一個public,類型為address的狀態變量。Address類型是一個160位的值,不允許任何的算術操作。它適合於存儲合約地址或是其他人的密鑰對。Public關鍵字會自動產生用於外部訪問該變量值的方法。如果不聲明public,其他的合約是無法訪問該變量的。自動產生的方法類似於:
function minter() returns (address) { return minter; }
當然如果你增加了一個和上面完全一樣的方法是沒有任何作用的,我們需要變量和產生的方法名完全一致。這塊其實編譯器會幫助我們完成,不需要我們自己動手編寫,我們只要知道這個概念就可以。
mapping (address => uint) public balances;
還是創建了一個公有狀態變量,這是一個比address更復雜的數據類型,類似java裏的Map<address,uint>,它描述了一個地址和一個uinit數據類型的map關系。Mappings的關系可以看成是一個hash表,所有可能的key都對應了一個0的值。當然在map裏不存在只有key值或是只有value值的情況。所以我們需要記住添加了一個什麽樣的map關系或是像這個例子一樣,如何使用它。因為這是個public變量,所以系統會自動為它生成一個get方法,類似於:
function balances(address _account) returns (uint) {
return balances[_account];
}
通過上面的方法我們可以很容易的查詢一個賬號的余額。
event Sent(address from, address to, uint amount);
這一行創建了一個名為event 的事件。該事件會在該示例的最後一行被觸發。用戶或是server應用可以花很低的代價(後面會講代價是什麽)來監聽事件的觸發。一旦這個事件被觸發了,監聽者接收到三個參數:from, to,amount.也是說從哪個賬號,到哪個賬號,金額是多少。通過這三個參數可以很容易追蹤到具體的交易。為了監聽這個事件,我們需要使用如下代碼:
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可以被任何賬號(必須有以太幣的賬號)調用並發送以太幣給另外一個賬號。註意,如果你用合約發送以太幣到另外一個賬號,通過區塊鏈瀏覽器查看是查看不到任何變化的,因為發送以太幣的過程和金額的變化都被存儲在了特殊的以太幣合約裏。而不是體現在賬號上。通過使用事件,可以很容易的創建一個區塊鏈瀏覽器,用來查看交易和賬號余額。
SolidityOA幸運飛艇源碼下載概述及基本代碼展示