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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

solidity

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

uintItemId;

stringname;

uintamount;

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

uintBuyerId;

addressBuyerAddress;

boolisBuyer;

uintOrderCount;

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

structOrder{

uintOrderId;

uintBuyerId;

uintItemId;

uintamount;

boolShipped;

boolFinished;

}BuyerId代表買家編號,BuyerAddress代表買家的地址(區(qū)塊鏈中的用戶地址),isBuyer代表該地址是由賣家認證的買家,可以進行下單操作,OrderCount為該買家下訂單的總數(shù)。在RemixIDE中創(chuàng)建工作空間和智能合約文件每個智能合約中最多只能有一個constructor函數(shù)。當智能合約被部署,constructor函數(shù)中的內容將被自動執(zhí)行。本任務中,使用constructor函數(shù)的主要目的是將部署智能合約的賬號初始化為賣家賬號,因此先新建一個address地址變量,然后在constructor函數(shù)中使這個變量等于部署智能合約的賬號的地址:addresspublicSeller;constructor(){Seller=msg.sender;}其中msg.sender代表部署該合約的賬號的地址。在RemixIDE中創(chuàng)建工作空間和智能合約文件使用function創(chuàng)建函數(shù),將函數(shù)命名為createItem,并要求調用者輸入貨物名稱_name和庫存數(shù)量_quantity。在大括號中編寫:由于只有賣家可以添加貨物,需要加入一行require函數(shù)來限制函數(shù)的調用者(賬號)。根據(jù)前文中設定的Seller變量,只有當調用函數(shù)的賬號是賣家的賬號時,函數(shù)才會被執(zhí)行。否則將會報錯并顯示逗號后的信息”O(jiān)nlySellercanadditem.”確認調用函數(shù)的賬號是賣家之后,函數(shù)將貨物列表的長度(新加入的貨物將自動被放在貨物列表的最后一位,所以貨物列表的長度就是貨物編號),貨物名稱,庫存數(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結構和貨物的struct結構類似,編寫的函數(shù)如下:其中同樣利用require函數(shù)要求了函數(shù)調用者的賬號必須是賣家賬號,否則系統(tǒng)將報錯。買家struct下的(buyers.length,_address,true,0)則分別代表:

BuyerId=buyers.length;BuyerAddress=_address;isBuyer=True;OrderCount=0;分別對應前文中編寫的structBuyer下的內容。functionregBuyer(address_address)

public{

require(msg.sender==Seller,

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

true,

0));

}

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

}在三個函數(shù)increaseItemQuantity,decreaseItemQuantity和updateItemQuantity中,分別使用了增加,減少和直接賦值的方法來修改已有貨物列表中的貨物庫存量。相同的,這三個函數(shù)中也加入了require函數(shù)來確定函數(shù)調用人的賬號身份,并且額外加入了一個判斷貨品是否存在和一個貨品庫存是否會變成負數(shù)(貨品數(shù)量減量不應大于當前庫存量)的函數(shù)。require函數(shù)判斷通過后,函數(shù)將自動修改列表Items中對應貨物的庫存量。在RemixIDE中創(chuàng)建工作空間和智能合約文件使用Solidity編寫智能合約時,可直接使用return函數(shù)輸出整個列表。因此,可直接利用return函數(shù)實現(xiàn)對貨物庫存,買家列表和訂單列表的調用查詢:也可以通過在調用函數(shù)時輸入想要查詢的訂單編號使函數(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ù)程序設計,創(chuàng)建訂單的動作應該由買家完成。因此,在函數(shù)中添加了判斷調用人賬號為買家的require函數(shù)。同時也添加了判斷貨物和買家編號是否存在的函數(shù)。判斷通過后,函數(shù)將創(chuà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;分別對應前文中創(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)建工作空間和智能合約文件當訂單被創(chuàng)建后,賣家將可以通過查詢函數(shù)確認訂單需求并且發(fā)貨。本任務僅模擬賣家已經完成發(fā)貨并在區(qū)塊鏈貨運追蹤應用中將指定訂單標記成已發(fā)貨(shipped)狀態(tài)。以下函數(shù)將被調用:此函數(shù)依然要求調用者賬號為賣家賬號,并且需要賣家提供訂單編號。賣家調用此函數(shù)后,對應貨物的庫存量將通過前文中編寫的較少庫存數(shù)量函數(shù)更新,對應訂單struct下的Shipped變量將被修改為true,表示已經發(fā)貨,等待買家確認收貨。

functionshipOrder(uint_OrderId)

public{

require(msg.sender==Seller,

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

true;

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

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;

}

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

溫馨提示

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

評論

0/150

提交評論