您好,登錄后才能下訂單哦!
這篇文章主要介紹“Solidity基本代碼舉例分析”,在日常操作中,相信很多人在Solidity基本代碼舉例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Solidity基本代碼舉例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Solidity是實施智能合約的契約導向的高級語言。它受到C ++,Python和JavaScript的影響,旨在針對以太坊虛擬機(EVM)。
Solidity是靜態類型的,支持繼承,庫和復雜的用戶定義類型等功能。
我們從一個基礎的solidity例子開始。開始的時候,你可能看不懂每一行具體的意思,但是沒關系,我們會在后續的講解中介紹每一個細節。
1 2 3 4 5 6 7 8 9 10 11 | pragma solidity ^0.4.0; contract SimpleStorage { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint) { return storedData; } } |
第一行告訴快3平臺出租出售Q1619668668【www.wkyule.com】該合約用的是0.4.0版本的solidity編寫,并且這些代碼具有向上兼容性。保證不會在不同solidity編譯版本下編譯會出現不同的行為。
從Solidity角度來看,合約就是存在于以太坊區塊鏈中的一個特定地址中的代碼和數據集合。uint storedData 聲明了一個類型為 uint(256位的無符號整型)的變量,變量名稱為 storedData。你可以把它想象為數據庫中的一個字段,該字段是可以被數據庫中的方法進行查詢,修改。在以太坊中,這個字段是屬于一個合約字段。在這個例子中,該變量可以通過提供的get,set方法進行獲取或是修改。在Solidity中,訪問一個變量是不需要通過this來引用的。
這個合約很簡單,只是允許以太坊上的任何人來存儲一個數據到某個節點,同時把這個操作發布到以太坊中,當然,以太坊上的其他節點同樣可以通過調用set方法來修改你已經存儲好的值。雖然有被修改,但是對該值操作的任何歷史記錄都是保存在以太坊中的。不用擔心你的存儲記錄或是修改記錄會丟失。后面我們會將到如何對合約進行限制,只允許你一個人修改這個數據。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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.也是說從哪個賬號,到哪個賬號,金額是多少。通過這三個參數可以很容易追蹤到具體的交易。為了監聽這個事件,我們需要使用如下代碼:
1 2 3 4 5 6 7 8 9 10 | 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可以被任何賬號(必須有以太幣的賬號)調用并發送以太幣給另外一個賬號。注意,如果你用合約發送以太幣到另外一個賬號,通過區塊鏈瀏覽器查看是查看不到任何變化的,因為發送以太幣的過程和金額的變化都被存儲在了特殊的以太幣合約里。而不是體現在賬號上。通過使用事件,可以很容易的創建一個區塊鏈瀏覽器,用來查看交易和賬號余額。
到此,關于“Solidity基本代碼舉例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。