| 知乎專欄 | 多維度架構 | | | 微信號 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() // 電影開播,鎖定這個合約