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 ...
随机推荐
- 【Python】安装配置Anaconda
优点:解决Python 库依赖问题 清华安装镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
- 1 如何使用pb文件保存和恢复模型进行迁移学习(学习Tensorflow 实战google深度学习框架)
学习过程是Tensorflow 实战google深度学习框架一书的第六章的迁移学习环节. 具体见我提出的问题:https://www.tensorflowers.cn/t/5314 参考https:/ ...
- 3.获取git仓库
有两种取得 Git 项目仓库的方法. 第一种是在现有项目或目录下导入所有文件到 Git 中: 第二种是从一个服务器克隆一个现有的 Git 仓库. 在现有目录中初始化仓库 如果你打算使用 Git 来对现 ...
- SQL Server ->> SQL Server 2016新特性之 -- Dynamic Data Masking
Dynamic Data Masking是为了防止敏感数据暴露给未经授权的用户,以一种最小开销和维护成本的形式.Dynamic Data Masking用于表的字段,相当于盖住字段数据的一部分.比如一 ...
- double转换long的疑问
在lua(5.1.4)下面测试的时候使用0x100000000的时候出现了问题,打印结果很明显,如下所示: Lua Copyright (C) - Lua.org, PUC-Rio > prin ...
- HBase编程 API入门系列之put(客户端而言)(1)
心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. [hadoop@HadoopSlave1 conf]$ cat regionservers HadoopMasterHadoopS ...
- 第四周 day4 python学习笔记
关于装饰器的更多信息可以参考http://egon09.blog.51cto.com/9161406/1836763 1.装饰器Decorator 装饰器:本质上是函数,(装饰其他函数),就是为其他函 ...
- Hibernate初探之一对多映射 及 myeclipse自动生成hibernate文件方法
实现单向一对多: 1)在one方的实体中添加保存many方的集合 2)在one方的配置文件中添加<one-to-many>配置 实现单向多对一: 1)在many方的实体中添加one方的引用 ...
- Microsoft Visual C++ 2005 Redistributable 无法卸载问题解决办法
今日遇到一个问题,Microsoft Visual C++ 2005 Redistributable 无法卸载,弹出的对话框如下所示: 试了一些网上的方法,比如下载vcredist_x86.exe,解 ...
- 在WAS下找不到主机名称的问题
发生错误: 联合 ADMU0036E: Deployment Manager 不能根据名称主机 cdzfwas2 在地址 127.0.0.1 查找 期间发生错误:正在回滚到原始配置 ...