快速學習-智能合約概述

智能合約概述

Solidity中合約

  • 一組代碼(合約的函數 )和數據(合約的狀態 ),它們位於以太坊區塊鏈的一個特定地址上
  • 代碼行 uint storedData; 聲明一個類型爲 uint (256位無符號整數)的狀態變量,叫做 storedData
  • 函數 set 和 get 可以用來變更或取出變量的值

合約結構

  • 狀態變量(State Variables)作爲合約狀態的一部分,值會永久保存在存儲空間內。
  • 函數(Functions)合約中可執行的代碼塊。
  • 函數修飾器(Function Modifiers)用在函數聲明中,用來補充修飾函數的語義。
  • 事件(Events)非常方便的 EVM 日誌工具接口。

合約代碼解讀

address public minter;
  • 這一行聲明瞭一個可以被公開訪問的 address 類型的狀態變量。
  • 關鍵字 public 自動生成一個函數,允許你在這個合約之外訪問這個狀態變量的當前值。
mapping(address => uint) public balances;
  • 也創建一個公共狀態變量,但它是一個更復雜的數據類型,該類型將 address 映射爲無符號整數。
  • mappings 可以看作是一個哈希表,它會執行虛擬初始化,把所有可能存在的鍵都映射到一個字節表示爲全零的值。
event Sent(address from, address to, uint amount);
  • 聲明瞭一個“事件”(event),它會在 send 函數的最後一行觸發
  • 用戶可以監聽區塊鏈上正在發送的事件,而不會花費太多成本。一旦它被髮出,監聽該事件的listener都將收到通知
  • 所有的事件都包含了 from , to 和 amount 三個參數,可方便追蹤事務
emit Sent(msg.sender, receiver, amount);
  • 觸發Sent事件,並將參數傳入

事件的監聽

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));
pragma solidity > 0.4 .22 < 0.6 .0;
contract Coin {
	address public minter;
	mapping(address => uint) public balances;
	event Sent(address from, address to, uint amount);
	constructor() public {
		minter = msg.sender;
	}

	function mint(address receiver, uint amount) public {
		require(msg.sender == minter);
		balances[receiver] += amount;
	}

	function send(address receiver, uint amount) public {
		require(amount <= balances[msg.sender]);
		balances[msg.sender] -= amount;
		balances[receiver] += amount;
		emit Sent(msg.sender, receiver, amount);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章