知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
最近一直在思考區塊鏈在各種場景下的落地問題。
下面是電影院場景區塊鏈應用探索,這是我的一個設想,區塊鏈如何在院綫場景落地的一些思路。
為此我寫一個這樣的智能合約,實現了構造方法描述一部電影票價,坐位數量,可以實現訂票,扣款,退票,還款等功能。
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); } } }
例如現在要上映一部影片步驟是, 首先實例化合約,然後部署合約
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() // 電影開播,鎖定這個合約