任務(wù)七 貨運(yùn)追蹤區(qū)塊鏈應(yīng)用開發(fā)_第1頁
任務(wù)七 貨運(yùn)追蹤區(qū)塊鏈應(yīng)用開發(fā)_第2頁
任務(wù)七 貨運(yùn)追蹤區(qū)塊鏈應(yīng)用開發(fā)_第3頁
任務(wù)七 貨運(yùn)追蹤區(qū)塊鏈應(yīng)用開發(fā)_第4頁
任務(wù)七 貨運(yùn)追蹤區(qū)塊鏈應(yīng)用開發(fā)_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

貨運(yùn)追蹤區(qū)塊鏈應(yīng)用開發(fā)>content區(qū)塊鏈技術(shù)起源OriginofBlockChainTechnology01區(qū)塊鏈技術(shù)類型與特征TypesandCharacteristicsofBlockChainTechnology02區(qū)塊鏈技術(shù)應(yīng)用領(lǐng)域ApplicationFieldofBlockChainTechnology03區(qū)塊鏈技術(shù)面臨的挑戰(zhàn)ChallengesofBlockChainTechnology04使用RemixIDE開發(fā)貨運(yùn)追蹤區(qū)塊鏈應(yīng)用PART011. 賣家部署合約,并將自身地址注冊(cè)為賣家。2. 賣家添加貨物,并設(shè)置貨物庫(kù)存。系統(tǒng)自動(dòng)生成一個(gè)包括貨物編號(hào),名稱和庫(kù)存數(shù)量的列表。賣家可以通過執(zhí)行函數(shù)管理貨物的庫(kù)存量。3. 賣家將買家的地址注冊(cè)成為買家。系統(tǒng)自動(dòng)生成一個(gè)包括買家編號(hào),地址和總訂單數(shù)的列表。4. 買家注冊(cè)成功之后可以執(zhí)行下訂單的函數(shù),輸入自己的買家編號(hào),想要訂購(gòu)的貨物編號(hào)和訂購(gòu)數(shù)量來生成訂單。5. 賣家確認(rèn)訂單,發(fā)貨之后將訂單標(biāo)記為已發(fā)貨(shipped)。6. 買家確認(rèn)收貨將訂單標(biāo)記為已完成(finished)。使用RemixIDE搭建一個(gè)貨物追蹤區(qū)塊鏈應(yīng)用使用RemixIDE開發(fā)貨運(yùn)追蹤區(qū)塊鏈應(yīng)用RemixIDE是一款基于瀏覽器的集成開發(fā)環(huán)境(IDE),用于開發(fā)和部署以太坊智能合約。RemixIDE是一個(gè)開源項(xiàng)目,由ConsenSys開發(fā)和維護(hù)。本小節(jié)將介紹RemixIDE的主要功能,網(wǎng)站界面和基本操作,并且開始搭建一個(gè)簡(jiǎn)單的貨運(yùn)追蹤區(qū)塊鏈應(yīng)用。使用RemixIDE開發(fā)貨運(yùn)追蹤區(qū)塊鏈應(yīng)用RemixIDE的主要功能包括:- 代碼編輯器:RemixIDE提供了一個(gè)代碼編輯器,用于編寫Solidity智能合約代碼。代碼編輯器支持語法高亮,自動(dòng)補(bǔ)全和錯(cuò)誤檢查等功能。使用RemixIDE開發(fā)貨運(yùn)追蹤區(qū)塊鏈應(yīng)用編譯器:RemixIDE可以將Solidity智能合約代碼編譯成字節(jié)碼。字節(jié)碼事可以在以太坊虛擬機(jī)(EVM)上運(yùn)行的代碼。由于RemixIDE是基于瀏覽器的線上編輯環(huán)境,編譯器可支持所有Solidity語言版本。使用RemixIDE開發(fā)貨運(yùn)追蹤區(qū)塊鏈應(yīng)用- 調(diào)試器:RemixIDE提供了一個(gè)調(diào)試器,用于調(diào)試智能合約代碼。調(diào)試器允許測(cè)試者設(shè)置斷點(diǎn),檢查變量和調(diào)用函數(shù)。使用RemixIDE開發(fā)貨運(yùn)追蹤區(qū)塊鏈應(yīng)用部署和執(zhí)行:在RemixIDE中部署和運(yùn)行智能合約時(shí),可以選擇將智能合約部署到不同的環(huán)境中。用戶可以選擇將智能合約部署到RemixIDE提供的沙盒區(qū)塊鏈中(RemixVM)的某一個(gè)分叉(fork)上,或者可以通過提供URL將Remix鏈接到一個(gè)遠(yuǎn)程節(jié)點(diǎn)并部署和執(zhí)行智能合約。在RemixIDE中創(chuàng)建工作空間和智能合約文件PART02在RemixIDE中創(chuàng)建工作空間和智能合約文件使用瀏覽器輸入/進(jìn)入RemixIDE主頁。點(diǎn)擊左側(cè)工具欄中的文件瀏覽器(Fileexplorer)圖標(biāo)。在工作空間操作中,新建工作空間,選擇基礎(chǔ),點(diǎn)擊確認(rèn)。在RemixIDE中創(chuàng)建工作空間和智能合約文件在新建的工作空間的文件瀏覽器contracts文件夾中,已經(jīng)存在三個(gè)預(yù)設(shè)的實(shí)例Solidity智能合約代碼,可以直接右鍵刪除或者不理會(huì),不會(huì)影響后續(xù)智能合約代碼編寫。右鍵contracts文件夾,可以在該文件夾下新建一個(gè)文件。將文件命名為zhuizong.sol,新建一個(gè)Solidity智能合約文件。單機(jī)回車,右側(cè)將會(huì)打開代碼編輯器,顯示zhuizong.sol的內(nèi)容,即可開始編寫智能合約程序。//SPDX-License-Identifier:MITpragma

solidity

^0.8.0;其中第一行注釋中的SPDX-License-Identifier代表引入SPDX許可證。使用Solidity0.6.0以上版本不引入許可證將會(huì)出現(xiàn)警告。pragmasolidity語句聲明了本智能合約使用的Solidity語言版本并設(shè)定Solidity編譯器版本,^0.8.0代表需要0.8.0以上的版本的Solidity編譯器編譯該智能合約。在RemixIDE中創(chuàng)建工作空間和智能合約文件正式開始編寫合約(contract):contractBuySell{}其中contract后的BuySell為可自定義的合約名稱。注意之后所有的合約代碼編寫都要在兩個(gè)大括號(hào)中間插入的空行中。在RemixIDE中創(chuàng)建工作空間和智能合約文件為了賣家可以方便管理庫(kù)存,訂單和買家,可以在智能合約中創(chuàng)建三個(gè)struct類來集成貨物,訂單和買家的信息。structItem{

uintItemId;

stringname;

uintamount;

}其中,ItemId代表貨物的編號(hào),name代表貨物名稱,amount代表貨物的現(xiàn)有庫(kù)存數(shù)量。買家struct:structBuyer{

uintBuyerId;

addressBuyerAddress;

boolisBuyer;

uintOrderCount;

}BuyerId代表買家編號(hào),BuyerAddress代表買家的地址(區(qū)塊鏈中的用戶地址),isBuyer代表該地址是由賣家認(rèn)證的買家,可以進(jìn)行下單操作,OrderCount為該買家下訂單的總數(shù)。在RemixIDE中創(chuàng)建工作空間和智能合約文件訂單struct:

structOrder{

uintOrderId;

uintBuyerId;

uintItemId;

uintamount;

boolShipped;

boolFinished;

}BuyerId代表買家編號(hào),BuyerAddress代表買家的地址(區(qū)塊鏈中的用戶地址),isBuyer代表該地址是由賣家認(rèn)證的買家,可以進(jìn)行下單操作,OrderCount為該買家下訂單的總數(shù)。在RemixIDE中創(chuàng)建工作空間和智能合約文件每個(gè)智能合約中最多只能有一個(gè)constructor函數(shù)。當(dāng)智能合約被部署,constructor函數(shù)中的內(nèi)容將被自動(dòng)執(zhí)行。本任務(wù)中,使用constructor函數(shù)的主要目的是將部署智能合約的賬號(hào)初始化為賣家賬號(hào),因此先新建一個(gè)address地址變量,然后在constructor函數(shù)中使這個(gè)變量等于部署智能合約的賬號(hào)的地址:addresspublicSeller;constructor(){Seller=msg.sender;}其中msg.sender代表部署該合約的賬號(hào)的地址。在RemixIDE中創(chuàng)建工作空間和智能合約文件使用function創(chuàng)建函數(shù),將函數(shù)命名為createItem,并要求調(diào)用者輸入貨物名稱_name和庫(kù)存數(shù)量_quantity。在大括號(hào)中編寫:由于只有賣家可以添加貨物,需要加入一行require函數(shù)來限制函數(shù)的調(diào)用者(賬號(hào))。根據(jù)前文中設(shè)定的Seller變量,只有當(dāng)調(diào)用函數(shù)的賬號(hào)是賣家的賬號(hào)時(shí),函數(shù)才會(huì)被執(zhí)行。否則將會(huì)報(bào)錯(cuò)并顯示逗號(hào)后的信息”O(jiān)nlySellercanadditem.”確認(rèn)調(diào)用函數(shù)的賬號(hào)是賣家之后,函數(shù)將貨物列表的長(zhǎng)度(新加入的貨物將自動(dòng)被放在貨物列表的最后一位,所以貨物列表的長(zhǎng)度就是貨物編號(hào)),貨物名稱,庫(kù)存數(shù)量編成一個(gè)前文中設(shè)置好Item并且將此Item加入items列表中。

functioncreateItem(string

memory_name,

uint_quantity)

public

{

require(msg.sender==Seller,

"OnlySellercanadditem.");items.push(Item(items.length,_name,_quantity));

}

在RemixIDE中創(chuàng)建工作空間和智能合約文件在本智能合約中買家的struct結(jié)構(gòu)和貨物的struct結(jié)構(gòu)類似,編寫的函數(shù)如下:其中同樣利用require函數(shù)要求了函數(shù)調(diào)用者的賬號(hào)必須是賣家賬號(hào),否則系統(tǒng)將報(bào)錯(cuò)。買家struct下的(buyers.length,_address,true,0)則分別代表:

BuyerId=buyers.length;BuyerAddress=_address;isBuyer=True;OrderCount=0;分別對(duì)應(yīng)前文中編寫的structBuyer下的內(nèi)容。functionregBuyer(address_address)

public{

require(msg.sender==Seller,

"OnlySellercanaddbuyer.");buyers.push(Buyer(buyers.length,_address,

true,

0));

}

在RemixIDE中創(chuàng)建工作空間和智能合約文件在本智能合約中,賣家將可以通過調(diào)用函數(shù)來增加,減少或直接更新某件商品的庫(kù)存數(shù)量,可通過如下三個(gè)函數(shù)實(shí)現(xiàn),三個(gè)函數(shù)都只需要賣家輸入貨物的編號(hào)和增加/減少/更新的庫(kù)存量:functionincreaseItemQuantity(uint_id,

uint_increaseBy)

public

{

require(msg.sender==Seller,

"OnlySellercanmanageitems");

require(_id<items.length,

"Itemdoesnotexist.");items[_id].amount+=_increaseBy;

}

functiondecreaseItemQuantity(uint_id,

uint_decreaseBy)

public

{

require(msg.sender==Seller,

"OnlySellercanmanageitems");

require(_id<items.length,

"Itemdoesnotexist.");

require(items[_id].amount>=_decreaseBy,

"Quantitywouldbecomenegative.");items[_id].amount-=_decreaseBy;}functionupdateItemQuantity(uint_id,

uint_newQuantity)

public

{

require(_id<items.length,

"Itemdoesnotexist.");

require(msg.sender==Seller,

"OnlySellercanmanageitems");items[_id].amount=_newQuantity;

}在三個(gè)函數(shù)increaseItemQuantity,decreaseItemQuantity和updateItemQuantity中,分別使用了增加,減少和直接賦值的方法來修改已有貨物列表中的貨物庫(kù)存量。相同的,這三個(gè)函數(shù)中也加入了require函數(shù)來確定函數(shù)調(diào)用人的賬號(hào)身份,并且額外加入了一個(gè)判斷貨品是否存在和一個(gè)貨品庫(kù)存是否會(huì)變成負(fù)數(shù)(貨品數(shù)量減量不應(yīng)大于當(dāng)前庫(kù)存量)的函數(shù)。require函數(shù)判斷通過后,函數(shù)將自動(dòng)修改列表Items中對(duì)應(yīng)貨物的庫(kù)存量。在RemixIDE中創(chuàng)建工作空間和智能合約文件使用Solidity編寫智能合約時(shí),可直接使用return函數(shù)輸出整個(gè)列表。因此,可直接利用return函數(shù)實(shí)現(xiàn)對(duì)貨物庫(kù)存,買家列表和訂單列表的調(diào)用查詢:也可以通過在調(diào)用函數(shù)時(shí)輸入想要查詢的訂單編號(hào)使函數(shù)返回列表中指定位置的某一個(gè)元素,來實(shí)現(xiàn)查詢指定訂單的狀態(tài):

functiongetAllItems()

public

view

returns

(Item[]

memory)

{

returnitems;}

functiongetAllBuyers()

public

view

returns

(Buyer[]

memory)

{

returnbuyers;

}

functiongetAllOrders()

public

view

returns

(Order[]

memory)

{

returnorders;

}

functiongetOrderStatus(uint_id)

public

view

returns

(Ordermemory){

returnorders[_id];

}

在RemixIDE中創(chuàng)建工作空間和智能合約文件根據(jù)程序設(shè)計(jì),創(chuàng)建訂單的動(dòng)作應(yīng)該由買家完成。因此,在函數(shù)中添加了判斷調(diào)用人賬號(hào)為買家的require函數(shù)。同時(shí)也添加了判斷貨物和買家編號(hào)是否存在的函數(shù)。判斷通過后,函數(shù)將創(chuàng)建對(duì)應(yīng)的訂單struct并且更新買家的資料(買家struct下的訂單總數(shù)):訂單struct生成后,函數(shù)使用push函數(shù)將生成的訂單加入之前生成的訂單列表的末尾。訂單struct下的(orders.length,_buyerId,_ItemId,_quantity,false,false)則分別代表:

OrderId=orders.length;BuyerId=_buyerId;ItemId=_ItemId;amount=_quantity;Shipped=false;finished=false;分別對(duì)應(yīng)前文中創(chuàng)建的訂單struct。functioncreateOrder(uint_buyerId,

uint_id,

uint_quantity)

public{

require(_id<items.length,

"Itemdoesnotexist.");

require(_buyerId<buyers.length,

"Userdoesnotexist.");

require(msg.sender==buyers[_buyerId].BuyerAddress,

"OnlyBuyercanplaceorder.");buyers[_buyerId].OrderCount+=

1;orders.push(Order(orders.length,_buyerId,_id,_quantity,

false,

false));

}

在RemixIDE中創(chuàng)建工作空間和智能合約文件當(dāng)訂單被創(chuàng)建后,賣家將可以通過查詢函數(shù)確認(rèn)訂單需求并且發(fā)貨。本任務(wù)僅模擬賣家已經(jīng)完成發(fā)貨并在區(qū)塊鏈貨運(yùn)追蹤應(yīng)用中將指定訂單標(biāo)記成已發(fā)貨(shipped)狀態(tài)。以下函數(shù)將被調(diào)用:此函數(shù)依然要求調(diào)用者賬號(hào)為賣家賬號(hào),并且需要賣家提供訂單編號(hào)。賣家調(diào)用此函數(shù)后,對(duì)應(yīng)貨物的庫(kù)存量將通過前文中編寫的較少庫(kù)存數(shù)量函數(shù)更新,對(duì)應(yīng)訂單struct下的Shipped變量將被修改為true,表示已經(jīng)發(fā)貨,等待買家確認(rèn)收貨。

functionshipOrder(uint_OrderId)

public{

require(msg.sender==Seller,

"OnlySellercanmodifyorders.");decreaseItemQuantity(orders[_OrderId].ItemId,orders[_OrderId].amount);orders[_OrderId].Shipped=

true;

}在RemixIDE中創(chuàng)建工作空間和智能合約文件當(dāng)買家收到貨物之后,可以調(diào)用確認(rèn)收貨函數(shù)來將訂單標(biāo)記為已完成:相似的,確認(rèn)收貨函數(shù)中驗(yàn)證了買家的身份和地址,并且確認(rèn)了訂單已被賣家標(biāo)記為已發(fā)貨(shipped)。買家調(diào)用函數(shù)時(shí)被要求輸入自己的買家編號(hào)和訂單編號(hào),調(diào)用函數(shù)后將訂單列表中對(duì)應(yīng)的訂單的狀態(tài)修改成已完成(finished)。至此一個(gè)單獨(dú)的訂單收發(fā)循環(huán)結(jié)束。

functionrecieveOrder(uint_BuyerId,

uint_OrderId)

public{

require(_BuyerId==orders[_OrderId].BuyerId,

"Wronguser.");

require(orders[_OrderId].Shipped==

true,

"Ordernotshippedyet.");

require(msg.sender==buyers[_BuyerId].BuyerAddress,

"OnlyBuyercanfinishorder.");orders[_OrderId].Finished=

true;

}

貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用PART03貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用在RemixIDE界面左側(cè)的工具欄中找到Solidity編譯器并點(diǎn)擊進(jìn)入:貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用在編譯器界面中,選擇適配的編譯器版本。本任務(wù)的智能合約代碼對(duì)Solidity編譯器的要求為0.8.0以上,可直接選擇最新的編譯器版本:貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用點(diǎn)擊下方的編譯按鈕,編譯器將自動(dòng)編譯剛剛編寫的智能合約代碼zhuizong.sol(或者也可以使用快捷鍵Ctrl+S進(jìn)行編譯):貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用若編譯成功,左側(cè)工具欄中Solidity編譯器圖標(biāo)將改變,若有報(bào)錯(cuò),將在編譯器下方顯示并彈出調(diào)試器模塊。貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用編譯成功之后,在左側(cè)工具欄中找到部署&發(fā)交易模塊:在環(huán)境中,選擇RemixVM(shanghai)即可。每次使用,RemixIDE都會(huì)自動(dòng)生成15個(gè)模擬賬戶地址供測(cè)試者使用。在本智能合約中,共需要一個(gè)賣家賬戶和若干個(gè)買家賬戶。點(diǎn)擊賬戶地址右側(cè)的復(fù)制圖標(biāo)可以將賬戶的地址復(fù)制到剪貼板。通過點(diǎn)擊部署按鈕將智能合約部署上鏈前,需要確認(rèn)選擇的賬戶是設(shè)定的賣家賬戶,合約部署后,該賬戶將被constructor函數(shù)自動(dòng)設(shè)定為唯一的賣家。貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用選擇第一個(gè)賬戶,然后點(diǎn)擊部署按鈕。部署成功后界面右下部分的命令窗口將會(huì)返回信息:貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用同時(shí)在部署&發(fā)交易面板下方,可以看到以部署的合約,點(diǎn)擊右側(cè)箭頭展開可以顯示編寫在該合約中的所有函數(shù):貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用根據(jù)前文中設(shè)定的交易流程,首先以賣家身份登記貨物和庫(kù)存。本任務(wù)中模擬一個(gè)有三種貨物庫(kù)存的場(chǎng)景:貨物編號(hào)貨物名稱貨物庫(kù)存量0Huowu_1100001Huowu_2100002Huowu_310000貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用在createItem函數(shù)后的空格中分三次輸入:Huowu_1,10000Huowu_2,10000Huowu_3,10000貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用每輸入一組,點(diǎn)擊一次函數(shù)的按鈕來調(diào)用一次函數(shù),三個(gè)貨物共需要重復(fù)三次。每次成功調(diào)用函數(shù),命令窗口中將會(huì)發(fā)送一條包含了交易記錄,交易哈希和輸入輸出結(jié)果的信息。貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用此時(shí),可以執(zhí)行下方的getAllItems來查詢已存在的貨物列表,在函數(shù)按鈕下方和命令窗口都將返回已經(jīng)存在的貨物列表:貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用通過系統(tǒng)返回的信息可以確定三種貨物的庫(kù)存已經(jīng)生成:0,huowu_1,100001,huowu_2,100002,huowu_3,10000貨運(yùn)追蹤區(qū)塊鏈應(yīng)用的使用因?yàn)樵诰帉懼悄芎霞s時(shí)先定了注冊(cè)買家的

溫馨提示

  • 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. 人人文庫(kù)網(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)論