快速学习-智能合约概述

智能合约概述

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);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章