1. 程式人生 > 其它 >以太坊·電影院場景區塊鏈應用探索

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

本文節選自電子書《Netkiller Blockchain 手札》

Netkiller Blockchain 手札

本文作者最近在找工作,有意向致電 13113668890

Mr. Neo Chan, 陳景峰(BG7NYT)

中國廣東省深圳市龍華新區民治街道溪山美地 518131

+86 13113668890 <[email protected]>

文件始創於2018-02-10

版權 © 2018 Netkiller(Neo Chan). All rights reserved.

版權宣告

轉載請與作者聯絡,轉載時請務必標明文章原始出處和作者資訊及本宣告。

http://www.netkiller.cn

http://netkiller.sourceforge.net

微信訂閱號 netkiller-ebook (微信掃描二維碼)

QQ:13721218 請註明“讀者”

QQ群:128659835 請註明“讀者”

內容摘要

這一部關於區塊鏈開發及運維的電子書。

為什麼會寫區塊鏈電子書?因為2018年是區塊鏈年。

這本電子書是否會出版(紙質圖書)? 不會,因為網際網路技術更迭太快,紙質書籍的內容無法實時更新,一本書動輒百元,很快就成為垃圾,你會發現目前市面的上區塊鏈書籍至少是一年前寫的,內容已經過時,很多例子無法正確執行。所以我不會出版,電子書的內容會追逐技術發展,及時跟進軟體版本的升級,做到內容最新,至少是主流。

這本電子書與其他區塊鏈書籍有什麼不同?市面上大部分割槽塊鏈書籍都是用2/3去講區塊鏈原理,只要不到 1/3 的乾貨,乾貨不夠理論來湊,通篇將理論或是大談特談區塊鏈行業,這些內容更多是頭腦風暴,展望區塊鏈,均無法落地實施。本書與那些書籍完全不同,不講理論和原理,面向應用落地,注重例子,均是乾貨。

電子書更新頻率?每天都會有新內容加入,更新頻率最遲不會超過一週,更新內容請關注 https://github.com/netkiller/netkiller.github.io/commits/master

本文采用碎片化寫作,原文會不定期更新,請儘量閱讀原文。

http://www.netkiller.cn/blockchain/index.html

您的打賞是我的寫作動力:http://www.netkiller.cn/blockchain/donations.html

-----------------------------------

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

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

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

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

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.refundTicket("0x627306090abab3a6ebc60c78a8bef571400e9345", 2 ) // 退 2 張票
contract.playMovie() // 電影開播,鎖定這個合約