版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用智能合约处理业务逻辑问题描述传统交易和智能合约交易区别? 1.智能合约中的惩罚等条件是提前进行明晰的,适用于客观的请求场景。而传统合约则更适用于主观请求场景。
2.智能合约的成本要明显低于传统合约成本。因为智能合约中的各项执行条件等已经被提前写入代码,执行时候不需要再耗费更多的人力物力即可进行。 3.智能合约可以用于提前预防,而传统合约则是事后判断。问题描述
在以太坊区块链的环境中,每对地址/私钥代表一个用户,每个用户有自己的钱、资产或权力,智能合约可以用来处理常见的业务逻辑。
接下来,我们用智能合约示例来看三个业务逻辑:购物、拍卖与投票。为了便于理解,我们所讨论的都是简化场景。另外我们还讨论了用数字签名来做一个区块链上的支票的案例。
用智能合约处理购物购物场景在简化的购物场景中也会至少包括卖家与买家两家。在面对面购物时,卖家给出商品,买家付钱,一手交钱一手交货。在卖家和买家不见面且相互不信任时,如何进行交易就成为一个难题。那么,能否用智能合约来充当中间人呢?以下是一个简化的远程购物示例。远程购物示例买家卖家创建卖单-2020
卖家金库买家下单购买-2040-20确认收货100-10其他状态智能合约金库区块链帐本购物场景
如图所示,我们创建一个智能合约来实现远程安全购物。智能合约运行在区块链上,这个智能合约有两种功能:一是实现业务逻辑,二是它可以作为不受卖方与买家影响的金库,独立、可信地管理资金。这个智能合约有四种状态,分别是:已创建卖单、已下单购买、已确认收货以及其他。示例代码contractPurchase{uintpublicvalue;//此参数为商品的定价addresspayablepublicseller;//卖主addresspayablepublicbuyer;//买主enumState{Created,Locked,Release,Inactive}Statepublicstate;//缺省为CreatedmodifieronlyBuyer(){…}modifieronlySeller(){…}modifierinState(State_state){…}//这是智能合约的构造函数,卖家创建这个智能合约时,//需要向智能合约转入以太币资金。示例代码//msg.value即为转入的以太币资金,这是抵押的资金。//这个抵押的资金是商品价格的两倍,因此也就赋值商品定价参数。constructor()publicpayable{seller=msg.sender;value=msg.value/2;require((2*value)==msg.value,"Valuehastobeeven.");}//在买家下单前,卖家可以取消商品functionabort()public实列代码onlyBuyer inState(State.Locked) { state=State.Release; buyer.transfer(value); } //卖家调用此函数,取回双倍抵押的资金、货款 //此数值为商品价格的三倍 functionrefundSeller() public示例代码onlySellerinState(State.Created){state=State.Inactive;seller.transfer(address(this).balance);}}用智能合约处理拍卖拍卖场景
由智能合约主持一个拍卖,在竞标的时间段内,竞标者可以向智能合约转入以太币资金,表示自己参与竞标。在竞标结束后,投标金额最高的竞标者获胜。示例代码contractSimpleAuction{addresspayablepublicbeneficiary;//投标的发起人(受益人)uintpublicauctionEndTime;//拍卖截止时间//在部署这个智能合约时,需要指定受益人、截止时间constructor(uint_biddingTime,addresspayable_beneficiary)public{beneficiary=_beneficiary;auctionEndTime=now+_biddingTime;}实例代码//拍卖的相关状态 //当前的最高竞标者、其金额 addresspublichighestBidder; uintpublichighestBid; //可以取回自己资金的竞标者名单 mapping(address=>uint)pendingReturns; //拍卖状态,缺省为`false`即未结束 boolended; //任何人都可以调用bid()函数竞标 //调用此函数时要相应地转入竞标资金msg.value
实例代码functionbid()publicpayable{ require( now<=auctionEndTime, "Auctionalreadyended." ); require( msg.value>highestBid, "Therealreadyisahigherbid." );if(highestBid!=0){ pendingReturns[highestBidder]+=highestBid; }示例代码highestBidder=msg.sender; highestBid=msg.value; emitHighestBidIncreased(msg.sender,msg.value); } //已经不是最高竞标者的人可以用withdraw()函数取回自己的资金 functionwithdraw()publicreturns(bool){ uintamount=pendingReturns[msg.sender]; if(amount>0){ pendingReturns[msg.sender]=0;
实例代码if(!msg.sender.send(amount)){ pendingReturns[msg.sender]=amount; returnfalse; } } returntrue; }
//调用此函数来结束拍卖,并将最高竞标人的资金转给受益人 functionauctionEnd()public{实例代码 //1.执行条件:拍卖时间段已经结束,且此函数还未被调用过require(now>=auctionEndTime,"Auctionnotyetended."); require(!ended,"auctionEndhasalreadybeencalled."); //2.结束拍卖,将资金转给受益人 ended=true; beneficiary.transfer(highestBid); }}用智能合约处理投票投票场景
智能合约还可以用来资金以外的权利、权益。接下来,我们来看用智能合约来编写一个投票系统。投票的发起方用区块链智能合约发起一个投票,对包括A、B、C、D等提案进行投票。投票发起方还要划定有权投票的人员范围,即赋予相关人投票权。
这个投票还有一个规则是,投票人可以将自己的票委托给其他人,由他代为投票。投票过程示例示例代码contractBallot{//投票人的数据结构structVoter{uintweight;//投票人持有的含委托的总票数boolvoted;//若为true,表示已投票addressdelegate;//投票权的被委托人uintvote;//所投的提案}//存储所有的投票人信息mapping(address=>Voter)publicvoters;//提案的数据结构示例代码structProposal{bytes32name;//提案名称uintvoteCount;//提案所获票数}//存储所有提案Proposal[]publicproposals;//此投票的管理者addresspublicchairperson;//此为智能合约的构造函数//输入值是投票的提案,我们假设分别为A、B、C、D//此投票的管理者就是这个智能合约的创建者示例代码constructor(bytes32[]memoryproposalNames)public{chairperson=msg.sender;voters[chairperson].weight=1;for(uinti=0;i<proposalNames.length;i++){proposals.push(Proposal({name:proposalNames[i],voteCount:0}));}}示例代码//投票的管理者可以调用此函数,赋予投票人投票权functiongiveRightToVote(addressvoter)public{require(msg.sender==chairperson,"Onlychairpersoncangiverighttovote.");require(!voters[voter].voted,"Thevoteralreadyvoted.");require(voters[voter].weight==0);voters[voter].weight=1;}示例代码//通过此函数,投票人把自己的投票权委托给他人functiondelegate(addressto)public{//如果你已经投票或已经委托,那么提示你已经投票Voterstoragesender=voters[msg.sender];require(!sender.voted,"Youalreadyvoted.");//你也不能把投票权委托给自己require(to!=msg.sender,"Self-delegationisdisallowed.");while(voters[to].delegate!=address(0)){to=voters[to].delegate;require(to!=msg.sender,"Foundloopindelegation.");}
示例代码//执行委托投票过程,分两种情况://1)如果被委托人已经投票,那么他所投提案的得票直接加一//2)如果被委托人尚未投票,那么他的投票权重加一,在稍后他投票时,权重为N则代表票数为N。sender.voted=true;sender.delegate=to;Voterstoragedelegate_=voters[to];if(delegate_.voted){proposals[delegate_.vote].voteCount+=sender.weight;}else{delegate_.weight+=sender.weight;}}示例代码//投票函数//如果没有人被委托,那么投出自己的一票//如果被委托,那么投出自己持有的所有票数functionvote(uintproposal)public{Voterstoragesender=voters[msg.sender];require(sender.weight!=0,"Hasnorighttovote");require(!sender.voted,"Alreadyvoted.");sender.voted=true;send
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年婚礼化妆造型合同
- 2024大数据中心存储设备采购合同
- 2024年度分包合作协议书
- 中考状语课件教学课件
- 2024年度版权返租及授权使用协议
- 2024年国际皮毛市场交易合同
- 乡镇防汛抗旱救灾的应急预案(5篇)
- (2024版)洒水车团队租赁合同(2024版)
- 2024年度软件许可及技术支持服务合同
- 2024年度互联网金融服务平台合作协议
- 2025年中考数学专题09 逆等线最值专题(原卷版)
- 短视频服务合同范本
- 2024年高考英语模拟试卷3(九省新高考卷) (二)
- 新媒体运营智慧树知到期末考试答案章节答案2024年黑龙江职业学院
- 耳鼻喉科病例讨论模板
- 《道路行驶记录仪检测装置校准规范-公示稿》
- 低分学生提升计划小学数学
- 滑坡泥石流-高中地理省公开课金奖全国赛课一等奖微课获奖
- 人工智能职业生涯规划报告总结
- 主题班队会教学设计
- 供应室停水停电应急预案
评论
0/150
提交评论