以太坊·電影院場景區塊鏈應用探索
本文節選自電子書《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() // 電影開播,鎖定這個合約