久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Solidity基本代碼舉例分析

136次閱讀
沒有評論

共計 3382 個字符,預計需要花費 9 分鐘才能閱讀完成。

這篇文章主要介紹“Solidity 基本代碼舉例分析”,在日常操作中,相信很多人在 Solidity 基本代碼舉例分析問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Solidity 基本代碼舉例分析”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!

Solidity 是實施智能合約的契約導向的高級語言。它受到 C ++,Python 和 JavaScript 的影響,旨在針對以太坊虛擬機 (EVM)。

Solidity 是靜態類型的,支持繼承,庫和復雜的用戶定義類型等功能。

1 Solidity 智能合約例子

我們從一個基礎的 solidity 例子開始。開始的時候,你可能看不懂每一行具體的意思,但是沒關系,我們會在后續的講解中介紹每一個細節。

1
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 方法來修改你已經存儲好的值。雖然有被修改,但是對該值操作的任何歷史記錄都是保存在以太坊中的。不用擔心你的存儲記錄或是修改記錄會丟失。后面我們會將到如何對合約進行限制,只允許你一個人修改這個數據。

2 Solidity 子貨幣例子

1
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
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 基本代碼舉例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-17發表,共計3382字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 江北区| 洛扎县| 武安市| 柳州市| 仙桃市| 巩留县| 新建县| 冷水江市| 麟游县| 台中县| 林州市| 和顺县| 乐平市| 平定县| 永登县| 天长市| 闽侯县| 景德镇市| 绥德县| 介休市| 绥中县| 富锦市| 新巴尔虎左旗| 建德市| 灵璧县| 甘孜| 黄山市| 凤阳县| 平武县| 柳河县| 阿巴嘎旗| 金川县| 象州县| 天津市| 克山县| 平舆县| 沧源| 高雄县| 四子王旗| 重庆市| 宿州市|