區(qū)塊鏈應(yīng)用技術(shù) 課件 第7章 區(qū)塊鏈智能合約與編程實(shí)現(xiàn)_第1頁
區(qū)塊鏈應(yīng)用技術(shù) 課件 第7章 區(qū)塊鏈智能合約與編程實(shí)現(xiàn)_第2頁
區(qū)塊鏈應(yīng)用技術(shù) 課件 第7章 區(qū)塊鏈智能合約與編程實(shí)現(xiàn)_第3頁
區(qū)塊鏈應(yīng)用技術(shù) 課件 第7章 區(qū)塊鏈智能合約與編程實(shí)現(xiàn)_第4頁
區(qū)塊鏈應(yīng)用技術(shù) 課件 第7章 區(qū)塊鏈智能合約與編程實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

區(qū)塊鏈之智能合約目錄起源和定義工作原理應(yīng)用場(chǎng)景起源和定義智能合約是一系列以數(shù)字形式指定的承諾,包括各方履行這些承諾的協(xié)議智能合約的定義:是一種旨在以信息化方式傳播、驗(yàn)證或執(zhí)行合的計(jì)算機(jī)協(xié)議。智能合約目的:智能合約的目的是提供優(yōu)于傳統(tǒng)合約的安全方法,并減少與合約相關(guān)的其他交易成本。工作原理基于區(qū)塊鏈的智能合約構(gòu)建及執(zhí)行分為以下幾步:第一步、多方用戶共同參與制定一份智能合約第二步、合約通過P2P網(wǎng)絡(luò)擴(kuò)散并存入?yún)^(qū)塊第三步、區(qū)塊鏈構(gòu)建的智能合約自動(dòng)執(zhí)行應(yīng)用場(chǎng)景一、金融領(lǐng)域:證券、保險(xiǎn)、貿(mào)易金融等。二、物聯(lián)網(wǎng)(IoT)領(lǐng)域。起源和定義四、管理領(lǐng)域:數(shù)字資產(chǎn)及版權(quán)管理、組織管理、政務(wù)管理等。三、能源領(lǐng)域。感謝觀看用智能合約處理價(jià)值目錄通證,價(jià)值的數(shù)字表示物智能合約的價(jià)值以太坊——智能合約最好的載體一個(gè)簡(jiǎn)單的智能合約:Faucet通證,價(jià)值的數(shù)字表示物在《區(qū)塊鏈超入門》中,方軍提出,區(qū)塊鏈的基本功能是三個(gè)部分:1)去中心化地進(jìn)行價(jià)值表示的功能;2)進(jìn)行價(jià)值轉(zhuǎn)移的功能;3)價(jià)值表示物即通證(Token)通證,價(jià)值的數(shù)字表示物令牌系統(tǒng)TokenSystems鏈上令牌系統(tǒng)有很多應(yīng)用,從代表如美元或黃金等資產(chǎn)的子貨幣到公司股票,代表智能資產(chǎn)的單獨(dú)令牌,安全的不可偽造的優(yōu)惠券,甚至與傳統(tǒng)價(jià)值完全沒有關(guān)聯(lián)的令牌系統(tǒng),如積分獎(jiǎng)勵(lì)。通證,價(jià)值的數(shù)字表示物一般來講,在區(qū)塊鏈中,通證是價(jià)值的數(shù)字表示物。它可以指代門票、供應(yīng)鏈單據(jù)、股票、資產(chǎn)憑證、忠誠度積分或其他基于區(qū)塊鏈的產(chǎn)品與服務(wù)。

通證,價(jià)值的數(shù)字表示物在以太坊的通證編程實(shí)踐中,最主要的分類是可互換的ERC20標(biāo)準(zhǔn)與不可互換的ERC721標(biāo)準(zhǔn)。古董、藝術(shù)品等收藏品通常是不可互換的,比如以太坊上一個(gè)游戲迷戀貓中的每一只貓都是獨(dú)一無二的。智能合約的價(jià)值智能合約的價(jià)值在于,降低了交易成本,更高效且確保安全的前提下進(jìn)行交易。將之前麻煩的程序統(tǒng)統(tǒng)交給代碼進(jìn)行處理,而且代碼的犯錯(cuò)概率要遠(yuǎn)小于人為。以太坊——智能合約最好的載體在以太坊上面,任何人都能夠創(chuàng)建自己想要做的去中心化的智能合約。智能合約?旦被創(chuàng)建之后,就無需中間機(jī)構(gòu)參與,可以自動(dòng)執(zhí)行,并且沒有人可以操縱其運(yùn)行。以太坊——智能合約最好的載體另外,在以太坊上面,你可以編寫資產(chǎn)代碼,創(chuàng)建新的區(qū)塊鏈資產(chǎn),簡(jiǎn)單說來,就是你可以在以太坊平臺(tái)上面發(fā)行自己的代幣,代幣的名稱、發(fā)行機(jī)制、發(fā)行數(shù)量、代幣應(yīng)用場(chǎng)景都可以由發(fā)行者本人設(shè)計(jì)。一個(gè)簡(jiǎn)單的智能合約:Faucet在以太坊區(qū)塊鏈網(wǎng)絡(luò)中,以太幣(Ether)是一種特殊的通證,它被設(shè)計(jì)為這個(gè)全球計(jì)算機(jī)的燃料(gas),用戶在以太坊網(wǎng)絡(luò)中執(zhí)行各種計(jì)算,均要用以太幣相應(yīng)地支付燃料費(fèi)。智能合約特點(diǎn)規(guī)范性;不可逆性;不可違約性;匿名性。

智能合約的應(yīng)用1、數(shù)字身份智能合約可以讓用戶擁有和控制自己的數(shù)字身份,比如個(gè)人數(shù)據(jù)、信譽(yù)以及數(shù)字資產(chǎn)。2、證券在金融行業(yè)里,智能合約對(duì)于資本的管理具有非常重大的意義。3、記錄智能合約需要能夠在分布式賬本上存儲(chǔ)數(shù)據(jù),并且不會(huì)減緩性能或者破壞數(shù)據(jù)隱私。智能合約的應(yīng)用4、抵押貸款傳統(tǒng)的抵押貸款流程?般是人工完成的且容易出錯(cuò)。有了智能合約,就可以自動(dòng)流程內(nèi)的每?個(gè)環(huán)節(jié),包括支付處理,財(cái)產(chǎn)扣押。5、土地所有權(quán)記錄智能合約可以推動(dòng)財(cái)產(chǎn)轉(zhuǎn)讓,以提高交易的完整性、效率和透明度。世界上的國家,包括格魯吉亞、加納和洪都拉斯,都已經(jīng)把區(qū)塊鏈應(yīng)用于土地所有權(quán)記錄。感謝觀看用智能合約處理業(yè)務(wù)邏輯問題描述傳統(tǒng)交易和智能合約交易區(qū)別? 1.智能合約中的懲罰等條件是提前進(jìn)行明晰的,適用于客觀的請(qǐng)求場(chǎng)景。而傳統(tǒng)合約則更適用于主觀請(qǐng)求場(chǎng)景。

2.智能合約的成本要明顯低于傳統(tǒng)合約成本。因?yàn)橹悄芎霞s中的各項(xiàng)執(zhí)行條件等已經(jīng)被提前寫入代碼,執(zhí)行時(shí)候不需要再耗費(fèi)更多的人力物力即可進(jìn)行。 3.智能合約可以用于提前預(yù)防,而傳統(tǒng)合約則是事后判斷。問題描述

在以太坊區(qū)塊鏈的環(huán)境中,每對(duì)地址/私鑰代表一個(gè)用戶,每個(gè)用戶有自己的錢、資產(chǎn)或權(quán)力,智能合約可以用來處理常見的業(yè)務(wù)邏輯。

接下來,我們用智能合約示例來看三個(gè)業(yè)務(wù)邏輯:購物、拍賣與投票。為了便于理解,我們所討論的都是簡(jiǎn)化場(chǎng)景。另外我們還討論了用數(shù)字簽名來做一個(gè)區(qū)塊鏈上的支票的案例。

用智能合約處理購物購物場(chǎng)景在簡(jiǎn)化的購物場(chǎng)景中也會(huì)至少包括賣家與買家兩家。在面對(duì)面購物時(shí),賣家給出商品,買家付錢,一手交錢一手交貨。在賣家和買家不見面且相互不信任時(shí),如何進(jìn)行交易就成為一個(gè)難題。那么,能否用智能合約來充當(dāng)中間人呢?以下是一個(gè)簡(jiǎn)化的遠(yuǎn)程購物示例。遠(yuǎn)程購物示例買家賣家創(chuàng)建賣單-2020

賣家金庫買家下單購買-2040-20確認(rèn)收貨100-10其他狀態(tài)智能合約金庫區(qū)塊鏈帳本購物場(chǎng)景

如圖所示,我們創(chuàng)建一個(gè)智能合約來實(shí)現(xiàn)遠(yuǎn)程安全購物。智能合約運(yùn)行在區(qū)塊鏈上,這個(gè)智能合約有兩種功能:一是實(shí)現(xiàn)業(yè)務(wù)邏輯,二是它可以作為不受賣方與買家影響的金庫,獨(dú)立、可信地管理資金。這個(gè)智能合約有四種狀態(tài),分別是:已創(chuàng)建賣單、已下單購買、已確認(rèn)收貨以及其他。示例代碼contractPurchase{uintpublicvalue;//此參數(shù)為商品的定價(jià)addresspayablepublicseller;//賣主addresspayablepublicbuyer;//買主enumState{Created,Locked,Release,Inactive}Statepublicstate;//缺省為CreatedmodifieronlyBuyer(){…}modifieronlySeller(){…}modifierinState(State_state){…}//這是智能合約的構(gòu)造函數(shù),賣家創(chuàng)建這個(gè)智能合約時(shí),//需要向智能合約轉(zhuǎn)入以太幣資金。示例代碼//msg.value即為轉(zhuǎn)入的以太幣資金,這是抵押的資金。//這個(gè)抵押的資金是商品價(jià)格的兩倍,因此也就賦值商品定價(jià)參數(shù)。constructor()publicpayable{seller=msg.sender;value=msg.value/2;require((2*value)==msg.value,"Valuehastobeeven.");}//在買家下單前,賣家可以取消商品functionabort()public實(shí)列代碼onlyBuyer inState(State.Locked) { state=State.Release; buyer.transfer(value); } //賣家調(diào)用此函數(shù),取回雙倍抵押的資金、貨款 //此數(shù)值為商品價(jià)格的三倍 functionrefundSeller() public示例代碼onlySellerinState(State.Created){state=State.Inactive;seller.transfer(address(this).balance);}}用智能合約處理拍賣拍賣場(chǎng)景

由智能合約主持一個(gè)拍賣,在競(jìng)標(biāo)的時(shí)間段內(nèi),競(jìng)標(biāo)者可以向智能合約轉(zhuǎn)入以太幣資金,表示自己參與競(jìng)標(biāo)。在競(jìng)標(biāo)結(jié)束后,投標(biāo)金額最高的競(jìng)標(biāo)者獲勝。示例代碼contractSimpleAuction{addresspayablepublicbeneficiary;//投標(biāo)的發(fā)起人(受益人)uintpublicauctionEndTime;//拍賣截止時(shí)間//在部署這個(gè)智能合約時(shí),需要指定受益人、截止時(shí)間constructor(uint_biddingTime,addresspayable_beneficiary)public{beneficiary=_beneficiary;auctionEndTime=now+_biddingTime;}實(shí)例代碼//拍賣的相關(guān)狀態(tài) //當(dāng)前的最高競(jìng)標(biāo)者、其金額 addresspublichighestBidder; uintpublichighestBid; //可以取回自己資金的競(jìng)標(biāo)者名單 mapping(address=>uint)pendingReturns; //拍賣狀態(tài),缺省為`false`即未結(jié)束 boolended; //任何人都可以調(diào)用bid()函數(shù)競(jìng)標(biāo) //調(diào)用此函數(shù)時(shí)要相應(yīng)地轉(zhuǎn)入競(jìng)標(biāo)資金msg.value

實(shí)例代碼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); } //已經(jīng)不是最高競(jìng)標(biāo)者的人可以用withdraw()函數(shù)取回自己的資金 functionwithdraw()publicreturns(bool){ uintamount=pendingReturns[msg.sender]; if(amount>0){ pendingReturns[msg.sender]=0;

實(shí)例代碼if(!msg.sender.send(amount)){ pendingReturns[msg.sender]=amount; returnfalse; } } returntrue; }

//調(diào)用此函數(shù)來結(jié)束拍賣,并將最高競(jìng)標(biāo)人的資金轉(zhuǎn)給受益人 functionauctionEnd()public{實(shí)例代碼 //1.執(zhí)行條件:拍賣時(shí)間段已經(jīng)結(jié)束,且此函數(shù)還未被調(diào)用過require(now>=auctionEndTime,"Auctionnotyetended."); require(!ended,"auctionEndhasalreadybeencalled."); //2.結(jié)束拍賣,將資金轉(zhuǎn)給受益人 ended=true; beneficiary.transfer(highestBid); }}用智能合約處理投票投票場(chǎng)景

智能合約還可以用來資金以外的權(quán)利、權(quán)益。接下來,我們來看用智能合約來編寫一個(gè)投票系統(tǒng)。投票的發(fā)起方用區(qū)塊鏈智能合約發(fā)起一個(gè)投票,對(duì)包括A、B、C、D等提案進(jìn)行投票。投票發(fā)起方還要?jiǎng)澏ㄓ袡?quán)投票的人員范圍,即賦予相關(guān)人投票權(quán)。

這個(gè)投票還有一個(gè)規(guī)則是,投票人可以將自己的票委托給其他人,由他代為投票。投票過程示例示例代碼contractBallot{//投票人的數(shù)據(jù)結(jié)構(gòu)structVoter{uintweight;//投票人持有的含委托的總票數(shù)boolvoted;//若為true,表示已投票addressdelegate;//投票權(quán)的被委托人uintvote;//所投的提案}//存儲(chǔ)所有的投票人信息mapping(address=>Voter)publicvoters;//提案的數(shù)據(jù)結(jié)構(gòu)示例代碼structProposal{bytes32name;//提案名稱uintvoteCount;//提案所獲票數(shù)}//存儲(chǔ)所有提案Proposal[]publicproposals;//此投票的管理者addresspublicchairperson;//此為智能合約的構(gòu)造函數(shù)//輸入值是投票的提案,我們假設(shè)分別為A、B、C、D//此投票的管理者就是這個(gè)智能合約的創(chuàng)建者示例代碼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}));}}示例代碼//投票的管理者可以調(diào)用此函數(shù),賦予投票人投票權(quán)functiongiveRightToVote(addressvoter)public{require(msg.sender==chairperson,"Onlychairpersoncangiverighttovote.");require(!voters[voter].voted,"Thevoteralreadyvoted.");require(voters[voter].weight==0);voters[voter].weight=1;}示例代碼//通過此函數(shù),投票人把自己的投票權(quán)委托給他人functiondelegate(addressto)public{//如果你已經(jīng)投票或已經(jīng)委托,那么提示你已經(jīng)投票Voterstoragesender=voters[msg.sender];require(!sender.voted,"Youalreadyvoted.");//你也不能把投票權(quán)委托給自己require(to!=msg.sender,"Self-delegationisdisallowed.");while(voters[to].delegate!=address(0)){to=voters[to].delegate;require(to!=msg.sender,"Foundloopindelegation.");}

示例代碼//執(zhí)行委托投票過程,分兩種情況://1)如果被委托人已經(jīng)投票,那么他所投提案的得票直接加一//2)如果被委托人尚未投票,那么他的投票權(quán)重加一,在稍后他投票時(shí),權(quán)重為N則代表票數(shù)為N。sender.voted=true;sender.delegate=to;Voterstoragedelegate_=voters[to];if(delegate_.voted){proposals[delegate_.vote].voteCount+=sender.weight;}else{delegate_.weight+=sender.weight;}}示例代碼//投票函數(shù)//如果沒有人被委托,那么投出自己的一票//如果被委托,那么投出自己持有的所有票數(shù)functionvote(uintproposal)public{Voterstoragesender=voters[msg.sender];require(sender.weight!=0,"Hasnorighttovote");require(!sender.voted,"Alreadyvoted.");sender.voted=true;sender.vote=proposal;proposals[proposal].voteCount+=sender.weight;}示例代碼//調(diào)用此函數(shù),可以看到贏得投票的提案是什么functionwinningProposal()publicviewreturns(uintwinningProposal_){uintwinningVoteCount=0;for(uintp=0;p<proposals.length;p++){if(proposals[p].voteCount>winningVoteCount){winningVoteCount=proposals[p].voteCount;winningProposal_=p;}}}}Part4用智能合約處理支票支票場(chǎng)景我們也可以用智能合約來實(shí)現(xiàn)支票的功能,它利用了區(qū)塊鏈上的用私鑰簽名的數(shù)字簽名不可否認(rèn)的特性。支票的原本含義是,你持有這張我簽名的紙條,就可以找我兌換相應(yīng)的資金。接下來我們來看看,如何用智能合約實(shí)現(xiàn)區(qū)塊鏈上的數(shù)字支票。1.對(duì)一個(gè)消息簽名,同意一筆支付付款人收款人2.將對(duì)應(yīng)的款項(xiàng)存到智能合約3.向智能合約出示簽名消息4.智能合約驗(yàn)證,將款項(xiàng)支付給收款人感謝觀看!智能合約的編寫、部署與交互

目錄1.Solidity語言概述2.編譯器remix部署與使用3.Solidity語法4.使用Solidity開發(fā)智能合約1.Solidity語言概述

Solidity是用于編寫智能合約(smartcontract)的語言,從語法上和python,javascript類似,相比主流編程語言缺少類似多線程,并發(fā)等高級(jí)特性。

Solidity的特點(diǎn): 1.Solidity源文件通常以.sol為后綴。2.有特殊的Address的類型。3.有異常出現(xiàn),所有執(zhí)行都會(huì)被撤回2.編譯器remix部署與使用Remix在線編譯器:/2.編譯器remix部署與使用remix下載:1.準(zhǔn)備一臺(tái)虛擬機(jī),需要先關(guān)閉防火墻,提前下好Chrome、Docker2.啟動(dòng)docker服務(wù)

命令:#systemctlstartdocker.service3.載入dockerimage并打上tag

命令:#dockerload</home/blockchain/images/remix-ide.tar#dockertagf74866f6d042docker.io/remixproject/remix-ide:latest4.生成并運(yùn)行remix-idedocker容器

命令:#dockerrun-p8080:80remixproject/remix-ide:latest2.編譯器remix部署與使用5.通過Chrome瀏覽器訪問remix-ide,Chrome中輸入:8080remix-ide首頁2.編譯器remix部署與使用添加文件搜索界面插件管理器SOLIDITY圖標(biāo)用于編譯運(yùn)行3.Solidity語法solidity的四種訪問權(quán)限:

public:任何人都可以調(diào)用該函數(shù)

private:只有合約本身可以調(diào)用該函數(shù)

internal:合約默認(rèn)屬性,子合約可以訪問父合約的內(nèi)部函數(shù),

external:只有外部可以調(diào)用該函數(shù),而合約內(nèi)部不能調(diào)用。3.Solidity語法solidity的三種修飾符

view:可以自由調(diào)用,“查看”區(qū)塊鏈的狀態(tài)而不改變它。

pure:也可以自由調(diào)用,既不讀取也不寫入?yún)^(qū)塊鏈。

payable:常常用于將代幣發(fā)送給合約地址。3.Solidity語法solidity函數(shù)組成部分:function

函數(shù)名字(類型1名字,類型2名字,…,類型n名字)returns(類型1名字,類型2名字,…,類型n名字)示例代碼:pragmasolidity^0.4.0;contracthelloworld{functionstringtest(stringinputstr)publicviewreturns(string){returninputstr;}}3.Solidity語法數(shù)據(jù)類型:值類型、引用類型值類型:整數(shù)型(int、uint)、布爾型(bool)、定點(diǎn)數(shù)類型(fixed、ufixed)引用類型:數(shù)組、結(jié)構(gòu)體Struct、映射運(yùn)算符:算數(shù)運(yùn)算符、?較運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符條件運(yùn)算符。3.Solidity語法邏輯運(yùn)算符:Solidity?持的邏輯運(yùn)算符,如下表所示:假設(shè)變量A的值為10,變量B的值為20。&&(邏輯與)

||(邏輯或)例:(A&&B)為真

例:(A||B)為真!(邏輯?)例:!(A&&B)為假3.Solidity語法算數(shù)運(yùn)算符Solidity?持的算術(shù)運(yùn)算符,如下表所示:假設(shè)變量A的值為10,變量B的值為20。+(加)例:A+B=30

–(減)例:A–B=-10*(乘)例:A*B=200

/(除)例:B/A=2++(遞增)例:A++=11

--(遞減)例:A–=9%(取模)例:B%A=03.Solidity語法位運(yùn)算符Solidity?持的位運(yùn)算符,如下表所示:假設(shè)變量A的值為2,變量B的值為3。&(位與)

|(位或)例:(A&B)為2.

例:(A|B)為3.^(位異或)

~(位?)例:(A^B)為1.

例:(~B)為-4.<<(左移位))

>>(右移位)例:(A<<1)為4.

定例:(A>>1)為13.Solidity語法數(shù)組數(shù)組是?種引?類型,它是存儲(chǔ)同類元素的有序集合聲明數(shù)組:typearrayName[arraySize];例子:uintbalance[10];3.Solidity語法初始化固定?度數(shù)組uintbalance[3]=[1,2,3];以?個(gè)固定?度的數(shù)組來賦值給固定?度的數(shù)組,可以省略數(shù)組?度,可以創(chuàng)建與前?個(gè)示例完全相同的數(shù)組。:uintbalance[]=[1,2,3];將數(shù)組中第3個(gè)元素賦值為5。balance[2]=5;訪問數(shù)組元素:

uintsalary=balance[2];3.Solidity語法結(jié)構(gòu)體Struct定義結(jié)構(gòu)體,struct語句的格式如下:

示例:structstruct_name{ structBook{type1type_name_1;

stringtitle;type2type_nam

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論