区块链应用技术 课件 7.3用智能合约处理业务逻辑_第1页
区块链应用技术 课件 7.3用智能合约处理业务逻辑_第2页
区块链应用技术 课件 7.3用智能合约处理业务逻辑_第3页
区块链应用技术 课件 7.3用智能合约处理业务逻辑_第4页
区块链应用技术 课件 7.3用智能合约处理业务逻辑_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用智能合约处理业务逻辑问题描述传统交易和智能合约交易区别? 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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论