ethereum(以太坊)(实例)--"安全的远程购买"
2024-08-22 13:29:40
pragma solidity ^0.4.10; contract Safebuy{ uint public price;
address public seller;
address public buyer; constructor() public payable{
seller = msg.sender;
//uint value = msg.value / 2 ;
//require(value *2 ==msg.value);
price = msg.value;
} enum State{Create,Block,Release}
State public state;
//根据函数的执行,更改条件状态--对函数方法的执行规定一定的顺序
modifier StateStatus(State _state){
require(state == _state);
_;
} modifier OnlyBuyer(){
require(buyer == msg.sender);
_;
} modifier OnlySeller(){
require(seller == msg.sender);
_;
} event Abort();
event Deal();
event EndDeal(); function getBalance() view public returns(uint){
return address(this).balance;
//向该合约内共放入的以太币
//刚部署合约时:address(this).balance = msg.value
//买家交易达成时:address(this).balance = msg.value *2
} //state = State.Release 其他函数都无法执行,该合约被终止
//abort()在其他2个函数执行之前才能调用
function abort() OnlySeller StateStatus(State.Create) public{
emit Abort();
state = State.Release;
seller.transfer(address(this).balance);
}
//deal() 确定购买:在其他2个函数执行之前才能调用,先到先得,只执行一次
function deal() StateStatus(State.Create) payable public{
emit Deal();
buyer = msg.sender;
require(msg.value == price);
state = State.Block;
} //endDeal 确认付款:在deal()执行之后,才能够执行该函数
function endDeal() OnlyBuyer StateStatus(State.Block)payable public{
emit EndDeal();
state = State.Release; // 注意: 这实际上允许买方和卖方阻止退款 - 应该使用取回模式
//buyer.transfer(msg.value);在执行deal函数时,已经扣掉了ether
seller.transfer(address(this).balance);
}
}
学到的知识点:
1.enum:枚举根据改变枚举的状态,能够确定函数的执行顺序
2.address(this).balance:往该合约内注入的以太币
3.在函数执行之后,修改状态变量的值
最新文章
- Djago模板拾起
- 【JSTREE】 复选框默认选中【总结】
- 基于spring4.0配置分布式ehcache,以及相关使用
- PHP 与网址相关内容
- uva 562
- ios-控件的frame_center_bounds简单介绍
- python 打包与部署
- Java并发编程-volatile
- 伴随ListView、RecyclerView、ScrollView滚动滑入滑出小图标--第三方开源--FloatingActionButton
- android侧滑菜单笔记
- SQL Server调优系列基础篇 - 索引运算总结
- python is == 的区别
- HTML 5与HTML 4的区别
- MyBatis快速入门(一)
- win10应用 UWP 使用MD5算法
- WEB应用:预览
- django 表单过滤与查询
- Linux内核 kmalloc, kzalloc &; devm_kzalloc 区别【转】
- css美化页面
- EL表达式、 jstl标签
热门文章
- 提升PPT制作效率和颜值
- python 进程池的使用
- Python pymysql模块学习心得
- Linux 安装问题
- [Errno 14] problem making ssl connection Trying other mirror.
- Azkaban3.X的安装(2018年8月19日最新版本)
- Android Studio 独立引入(非友盟)微博分享和回调时问题
- (转)从信息隐藏的一个需求看C++接口与实现的分离
- ListView实现分页加载(三)实现分页加载
- codeforces 814E An unavoidable detour for home