Solidity是實施智能合約的契約導向的進階語言。它受到C ++,Python和JavaScript的影響,旨在針對以太坊虛擬機器(EVM)。
Solidity是靜態類型的,支援繼承,庫和複雜的使用者定義型別等功能。
您將會看到,可以建立投票,眾籌,盲目拍賣,多重簽名錢包等等的合約。
1 Solidity智能合約例子
我們從一個基礎的solidity例子開始。開始的時候,你可能看不懂每一行具體的意思,但是沒關係,我們會在後續的講解中介紹每一個細節。
第一行告訴該合約用的是0.4.0版本的solidity編寫,並且這些代碼具有向上相容性。保證不會在不同solidity編譯版本下編譯會出現不同的行為。
從Solidity角度來看,合約就是存在於以太坊區塊鏈中的一個特定地址中的代碼和資料集合。uint storedData 聲明了一個類型為 uint(256位的無符號整型)的變數,變數名稱為 storedData。你可以把它想象為資料庫中的一個欄位,該欄位是可以被資料庫中的方法進行查詢,修改。在以太坊中,這個欄位是屬於一個合約欄位。在這個例子中,該變數可以通過提供的get,set方法進行擷取或是修改。在Solidity中,訪問一個變數是不需要通過this來引用的。
這個合約很簡單,只是允許以太坊上的任何人來儲存一個資料到某個節點,同時把這個操作發布到以太坊中,當然,以太坊上的其他節點同樣可以通過調用set方法來修改你已經儲存好的值。雖然有被修改,但是對該值操作的任何記錄都是儲存在以太坊中的。不用擔心你的儲存記錄或是修改記錄會丟失。後面我們會將到如何對合約進行限制,只允許你一個人修改這個資料。
2 Solidity子貨幣例子
下面的例子將實現一個簡單的加密貨幣例子。無中生幣不在是夢想,當然只有合約的建立人才有這個特權。此外,任何人只要有一個以太坊金鑰組就可以進行貨幣交易,根本不需要註冊使用者名稱和密碼。這個合約引入了一些新的概念,讓我們一個個都過一遍。
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.也是說從哪個帳號,到哪個帳號,金額是多少。通過這三個參數可以很容易追蹤到具體的交易。為了監聽這個事件,我們需要使用如下代碼:
注意 :使用者是如何調用系統自動產生的balances方法。
Coin方法是構造方法,是在合約產生的時候系統會調用,而且之後不允許被調用。Msg(以及tx和block)是一個全域變數,儲存了可以被區塊鏈訪問的一些屬性。它持久化了建立合約的節點的地址。 Msg.sender是值該方法調用者的地址。
最後,真正完成合約功能的,並且被其他使用者調用的是mint和send方法。如果mint是被不是建立該合約的帳號調用,不會起任何作用。但是,send可以被任何帳號(必須有以太幣的帳號)調用並發送以太幣給另外一個帳號。注意,如果你用合約發送以太幣到另外一個帳號,通過區塊鏈瀏覽器查看是查看不到任何變化的,因為發送以太幣的過程和金額的變化都被儲存在了特殊的以太幣合約裡。而不是體現在帳號上。通過使用事件,可以很容易的建立一個區塊鏈瀏覽器,用來查看交易和帳號餘額。
原文連結:http://wangxiaoming.com/blog/2018/04/20/HPB-45-ETH-Solidity-code/