Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

2.3. 以太坊·電影院場景區塊鏈應用探索

最近一直在思考區塊鏈在各種場景下的落地問題。

下面是電影院場景區塊鏈應用探索,這是我的一個設想,區塊鏈如何在院綫場景落地的一些思路。

為此我寫一個這樣的智能合約,實現了構造方法描述一部電影票價,坐位數量,可以實現訂票,扣款,退票,還款等功能。

2.3.1. 合約檔案

		
pragma solidity ^0.4.21;

// author: netkiller
// home: http://www.netkiller.cn
// QQ:13721218

contract Movie {
  address public publisher;	//電影院
  string name;				//影片名稱
  uint price;				//票價
  uint public seat;			//坐位數量
  mapping (address => uint) public audience;
  
  bool play = false;			//電影是否已經開播,開播後不允許買票和退票。

  //合約構造方法
  function Movie(string _name, uint _price, uint _seat) public{
    publisher = msg.sender;
    name = _name;
    price = _price;
    seat = _seat;
  }
  
  //獲取剩餘坐位數量
  function getName() public view returns (string){
      return name;
  }
  
  //有時需要開放預留坐位,調整坐位數量
  function changeSeat(uint _seat) public {
    if (msg.sender != publisher) { return; }
    if (play == true){ return; }
    seat = _seat;
  }
  
  //獲取剩餘坐位數量
  function getSeat() public view returns (uint){
      return seat;
  }
    
  //買票方法,參數買票者,票數,買票後扣除用戶以太幣。
  function buyTicket(address _audience, uint _ticket) public payable returns (bool success) {
    if (_ticket >= seat) { return false; }
    if (play == true){ return false; }
    uint amount = price * _ticket;	//計算票價
    
    if (this.balance >= amount) { 
        _audience.transfer(_audience.balance - amount);
        publisher.transfer(publisher.balance + amount);
        audience[_audience] = _ticket;
        seat -= _ticket;
    }

    return true;
  }

  //退票
  function refundTicket(address _audience, uint _ticket) public {
    if (msg.sender != publisher) { return; }
    if (play == true){ return; }
    uint amount = price * _ticket;
    
    if (audience[_audience] <= _ticket) { 
      
      if (publisher.balance >= amount) { 
        _audience.transfer(_audience.balance + amount);
        publisher.transfer(publisher.balance - amount);
        audience[_audience] -= _ticket;
        seat += _ticket;

      }
    }
  }
  
  //播放電影,鎖定
  function playMovie() public {
      play = true;
  }
  
  //銷毀合約
  function destroy() public{ 
    if (msg.sender == publisher) { 
      selfdestruct(publisher); 
    }
  }
}

		
		

2.3.2. 合約用法

例如現在要上映一部影片步驟是, 首先實例化合約,然後部署合約

		
 
Movie("黑客帝國", "25", 80)		
		
		
		
var contract;
Movie.deployed().then(function(instance){contract=instance;});
contract.getName(); //獲得影片名字

contract.buyTicket("0x627306090abab3a6e1400e9345bc60c78a8bef57",1) // 購買 1 張票
contract.buyTicket("0x627306090abab3a6ebc60c78a8bef571400e9345",5) // 購買 5 張票
contract.buyTicket("0xf17f52151EbEF6C7334FAD080c5704D77216b732",2) // 購買 2 張票

...
...
contract.refundTicket("0x627306090abab3a6ebc60c78a8bef571400e9345", 2 ) // 退 2 張票

contract.audience.call().then(console.log);

contract.playMovie() // 電影開播,鎖定這個合約