本文节选自电子书《Netkiller Blockchain 手札》
中国广东省深圳市龙华新区民治街道溪山美地 518131
+86 13113668890 <netkiller@msn.com>
文档始创于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() // 电影开播,锁定这个合约
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有