ethereum(以太坊)(实例)--"安全的远程购买"
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.在函数执行之后,修改状态变量的值
ethereum(以太坊)(实例)--"安全的远程购买"的更多相关文章
- ethereum(以太坊)(实例)--"简单的公开竞拍"
说真的,刚开始接触这个竞拍案例--“简单的公开竞拍”,我就抱着简单的心态去查看这个实例,但是自我感觉并不简单.应该是我实力不到家的原因吧!!!233333...不过经过大半天的努力,自己理解完之后,觉 ...
- ethereum(以太坊)(一)
从这周开始,开始学习以太坊开发--solidity,开始决定往区块链方向发展,毕竟区块链技术应用广泛.一开始接触solidity开发语言不太习惯,毕竟一直在学习python语法,有很多都不能接受.有难 ...
- ethereum(以太坊)(十四)--Delete
pragma solidity ^0.4.10; contract Delete{ /* delete可用于任何变量(除mapping),将其设置成默认值 bytes/string:删除所有元素,其长 ...
- ethereum(以太坊)(基础)--容易忽略的坑(三)
pragma solidity ^0.4.10; contract Byte{ bytes [] public T=new bytes[](3); function setLeng(uint len) ...
- ethereum(以太坊)(基础)--容易忽略的坑(二)
pragma solidity ^0.4.0; contract EMath{ string public _a="lin"; function f() public{ modif ...
- ethereum(以太坊)(基础)--容易忽略的坑(一)
pragma solidity ^0.4.0; contract base{ address public _owner=msg.sender; uint _a; string internal _b ...
- ethereum(以太坊)(十三)--异常处理/元祖
pragma solidity ^0.4.4; contract Students{ uint[] data= new uint[](4); address _owner = msg.sender; ...
- ethereum(以太坊)(十二)--应用(二)__投票(基础总和)
编写应用合约之前,先弄清它的逻辑,有助于我们更好的部署合约 pragma solidity ^0.4.21; pragma experimental ABIEncoderV2; contract vo ...
- ethereum(以太坊)(十二)--应用(一)__集资(构造函数/映射)
pragma solidity ^0.4.4; contract funder{ //0xca35b7d915458ef540ade6068dfe2f44e8fa733c //0x14723a09ac ...
随机推荐
- C++:关于委托类
转自:http://blog.csdn.net/dadalan/article/details/4041931.vs2010已经支持function/bind,能很好实现委托. [说明] 本文不仅介绍 ...
- C++数组怎么复制
C++数组怎么复制: #include <string.h>main(){int a[10]={34,56,4,10,77,51,93,30,5,52};int b[10];memcpy( ...
- IIS 7 启用 gzip 静态压缩 压缩js和css文件
搞了很久,不如nginx好弄,不知道怎么修改压缩比,也不知道怎么压缩的规则是啥(管理器上没有写),不过反正出来了,一个js文件900多K变成了100多K 1.在web.config文件里面加上: &l ...
- VSTO 开发中 应用ActionPane、CustomTaskPane
以Excel插件为例: 1. ActionPane 创建 ThisWorkbook 项目 private void ThisWorkbook_Startup(object sender, System ...
- Mac os下profile设置
Mac os环境下home目录下是没有profile文件的开启终端后,读取的是/etc/profile文件因为个人喜欢使用ll命令,mac默认并没有这个命令,所以使用如下方法设置别名 cp -rp / ...
- Oracle 时段负载情况
ALTER session SET nls_date_format='yyyy-mm-dd hh24:mi:ss'; SELECT * FROM ( SELECT A.INSTANCE_NUMBER ...
- 如果使用没有提供选项值的 SqlDependency,必须先调用 SqlDependency.Start(),然后才能执行添加到 SqlDependency 实例中的命令
如标题错误,解决办法及出现错误情况,见图片 出现如图错误
- WEB开发的jsp例子标签库(jstl)的使用
<!-- e1 --> <%@ page language="java" contentType="text/html; charset=UTF-8&q ...
- 使用npoi插件将excel文件导出
大致流程:前端使用URL地址的方式跳转到action后返回file类型数据 js: window.location.href = '/Home/index?Id=' + id 后台代码: /// &l ...
- IntelliJ IDEA设置编码格式
IntelliJ IDEA设置编码格式为UTF-8