任务七 货运追踪区块链应用开发_第1页
任务七 货运追踪区块链应用开发_第2页
任务七 货运追踪区块链应用开发_第3页
任务七 货运追踪区块链应用开发_第4页
任务七 货运追踪区块链应用开发_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

货运追踪区块链应用开发>content区块链技术起源OriginofBlockChainTechnology01区块链技术类型与特征TypesandCharacteristicsofBlockChainTechnology02区块链技术应用领域ApplicationFieldofBlockChainTechnology03区块链技术面临的挑战ChallengesofBlockChainTechnology04使用RemixIDE开发货运追踪区块链应用PART011. 卖家部署合约,并将自身地址注册为卖家。2. 卖家添加货物,并设置货物库存。系统自动生成一个包括货物编号,名称和库存数量的列表。卖家可以通过执行函数管理货物的库存量。3. 卖家将买家的地址注册成为买家。系统自动生成一个包括买家编号,地址和总订单数的列表。4. 买家注册成功之后可以执行下订单的函数,输入自己的买家编号,想要订购的货物编号和订购数量来生成订单。5. 卖家确认订单,发货之后将订单标记为已发货(shipped)。6. 买家确认收货将订单标记为已完成(finished)。使用RemixIDE搭建一个货物追踪区块链应用使用RemixIDE开发货运追踪区块链应用RemixIDE是一款基于浏览器的集成开发环境(IDE),用于开发和部署以太坊智能合约。RemixIDE是一个开源项目,由ConsenSys开发和维护。本小节将介绍RemixIDE的主要功能,网站界面和基本操作,并且开始搭建一个简单的货运追踪区块链应用。使用RemixIDE开发货运追踪区块链应用RemixIDE的主要功能包括:- 代码编辑器:RemixIDE提供了一个代码编辑器,用于编写Solidity智能合约代码。代码编辑器支持语法高亮,自动补全和错误检查等功能。使用RemixIDE开发货运追踪区块链应用编译器:RemixIDE可以将Solidity智能合约代码编译成字节码。字节码事可以在以太坊虚拟机(EVM)上运行的代码。由于RemixIDE是基于浏览器的线上编辑环境,编译器可支持所有Solidity语言版本。使用RemixIDE开发货运追踪区块链应用- 调试器:RemixIDE提供了一个调试器,用于调试智能合约代码。调试器允许测试者设置断点,检查变量和调用函数。使用RemixIDE开发货运追踪区块链应用部署和执行:在RemixIDE中部署和运行智能合约时,可以选择将智能合约部署到不同的环境中。用户可以选择将智能合约部署到RemixIDE提供的沙盒区块链中(RemixVM)的某一个分叉(fork)上,或者可以通过提供URL将Remix链接到一个远程节点并部署和执行智能合约。在RemixIDE中创建工作空间和智能合约文件PART02在RemixIDE中创建工作空间和智能合约文件使用浏览器输入/进入RemixIDE主页。点击左侧工具栏中的文件浏览器(Fileexplorer)图标。在工作空间操作中,新建工作空间,选择基础,点击确认。在RemixIDE中创建工作空间和智能合约文件在新建的工作空间的文件浏览器contracts文件夹中,已经存在三个预设的实例Solidity智能合约代码,可以直接右键删除或者不理会,不会影响后续智能合约代码编写。右键contracts文件夹,可以在该文件夹下新建一个文件。将文件命名为zhuizong.sol,新建一个Solidity智能合约文件。单机回车,右侧将会打开代码编辑器,显示zhuizong.sol的内容,即可开始编写智能合约程序。//SPDX-License-Identifier:MITpragma

solidity

^0.8.0;其中第一行注释中的SPDX-License-Identifier代表引入SPDX许可证。使用Solidity0.6.0以上版本不引入许可证将会出现警告。pragmasolidity语句声明了本智能合约使用的Solidity语言版本并设定Solidity编译器版本,^0.8.0代表需要0.8.0以上的版本的Solidity编译器编译该智能合约。在RemixIDE中创建工作空间和智能合约文件正式开始编写合约(contract):contractBuySell{}其中contract后的BuySell为可自定义的合约名称。注意之后所有的合约代码编写都要在两个大括号中间插入的空行中。在RemixIDE中创建工作空间和智能合约文件为了卖家可以方便管理库存,订单和买家,可以在智能合约中创建三个struct类来集成货物,订单和买家的信息。structItem{

uintItemId;

stringname;

uintamount;

}其中,ItemId代表货物的编号,name代表货物名称,amount代表货物的现有库存数量。买家struct:structBuyer{

uintBuyerId;

addressBuyerAddress;

boolisBuyer;

uintOrderCount;

}BuyerId代表买家编号,BuyerAddress代表买家的地址(区块链中的用户地址),isBuyer代表该地址是由卖家认证的买家,可以进行下单操作,OrderCount为该买家下订单的总数。在RemixIDE中创建工作空间和智能合约文件订单struct:

structOrder{

uintOrderId;

uintBuyerId;

uintItemId;

uintamount;

boolShipped;

boolFinished;

}BuyerId代表买家编号,BuyerAddress代表买家的地址(区块链中的用户地址),isBuyer代表该地址是由卖家认证的买家,可以进行下单操作,OrderCount为该买家下订单的总数。在RemixIDE中创建工作空间和智能合约文件每个智能合约中最多只能有一个constructor函数。当智能合约被部署,constructor函数中的内容将被自动执行。本任务中,使用constructor函数的主要目的是将部署智能合约的账号初始化为卖家账号,因此先新建一个address地址变量,然后在constructor函数中使这个变量等于部署智能合约的账号的地址:addresspublicSeller;constructor(){Seller=msg.sender;}其中msg.sender代表部署该合约的账号的地址。在RemixIDE中创建工作空间和智能合约文件使用function创建函数,将函数命名为createItem,并要求调用者输入货物名称_name和库存数量_quantity。在大括号中编写:由于只有卖家可以添加货物,需要加入一行require函数来限制函数的调用者(账号)。根据前文中设定的Seller变量,只有当调用函数的账号是卖家的账号时,函数才会被执行。否则将会报错并显示逗号后的信息”OnlySellercanadditem.”确认调用函数的账号是卖家之后,函数将货物列表的长度(新加入的货物将自动被放在货物列表的最后一位,所以货物列表的长度就是货物编号),货物名称,库存数量编成一个前文中设置好Item并且将此Item加入items列表中。

functioncreateItem(string

memory_name,

uint_quantity)

public

{

require(msg.sender==Seller,

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

}

在RemixIDE中创建工作空间和智能合约文件在本智能合约中买家的struct结构和货物的struct结构类似,编写的函数如下:其中同样利用require函数要求了函数调用者的账号必须是卖家账号,否则系统将报错。买家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中创建工作空间和智能合约文件在本智能合约中,卖家将可以通过调用函数来增加,减少或直接更新某件商品的库存数量,可通过如下三个函数实现,三个函数都只需要卖家输入货物的编号和增加/减少/更新的库存量: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;

}在三个函数increaseItemQuantity,decreaseItemQuantity和updateItemQuantity中,分别使用了增加,减少和直接赋值的方法来修改已有货物列表中的货物库存量。相同的,这三个函数中也加入了require函数来确定函数调用人的账号身份,并且额外加入了一个判断货品是否存在和一个货品库存是否会变成负数(货品数量减量不应大于当前库存量)的函数。require函数判断通过后,函数将自动修改列表Items中对应货物的库存量。在RemixIDE中创建工作空间和智能合约文件使用Solidity编写智能合约时,可直接使用return函数输出整个列表。因此,可直接利用return函数实现对货物库存,买家列表和订单列表的调用查询:也可以通过在调用函数时输入想要查询的订单编号使函数返回列表中指定位置的某一个元素,来实现查询指定订单的状态:

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中创建工作空间和智能合约文件根据程序设计,创建订单的动作应该由买家完成。因此,在函数中添加了判断调用人账号为买家的require函数。同时也添加了判断货物和买家编号是否存在的函数。判断通过后,函数将创建对应的订单struct并且更新买家的资料(买家struct下的订单总数):订单struct生成后,函数使用push函数将生成的订单加入之前生成的订单列表的末尾。订单struct下的(orders.length,_buyerId,_ItemId,_quantity,false,false)则分别代表:

OrderId=orders.length;BuyerId=_buyerId;ItemId=_ItemId;amount=_quantity;Shipped=false;finished=false;分别对应前文中创建的订单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中创建工作空间和智能合约文件当订单被创建后,卖家将可以通过查询函数确认订单需求并且发货。本任务仅模拟卖家已经完成发货并在区块链货运追踪应用中将指定订单标记成已发货(shipped)状态。以下函数将被调用:此函数依然要求调用者账号为卖家账号,并且需要卖家提供订单编号。卖家调用此函数后,对应货物的库存量将通过前文中编写的较少库存数量函数更新,对应订单struct下的Shipped变量将被修改为true,表示已经发货,等待买家确认收货。

functionshipOrder(uint_OrderId)

public{

require(msg.sender==Seller,

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

true;

}在RemixIDE中创建工作空间和智能合约文件当买家收到货物之后,可以调用确认收货函数来将订单标记为已完成:相似的,确认收货函数中验证了买家的身份和地址,并且确认了订单已被卖家标记为已发货(shipped)。买家调用函数时被要求输入自己的买家编号和订单编号,调用函数后将订单列表中对应的订单的状态修改成已完成(finished)。至此一个单独的订单收发循环结束。

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;

}

货运追踪区块链应用的使用PART03货运追踪区块链应用的使用在RemixIDE界面左侧的工具栏中找到Solidity编译器并点击进入:货运追踪区块链应用的使用在编译器界面中,选择适配的编译器版本。本任务的智能合约代码对Solidity编译器的要求为0.8.0以上,可直接选择最新的编译器版本:货运追踪区块链应用的使用点击下方的编译按钮,编译器将自动编译刚刚编写的智能合约代码zhuizong.sol(或者也可以使用快捷键Ctrl+S进行编译):货运追踪区块链应用的使用若编译成功,左侧工具栏中Solidity编译器图标将改变,若有报错,将在编译器下方显示并弹出调试器模块。货运追踪区块链应用的使用编译成功之后,在左侧工具栏中找到部署&发交易模块:在环境中,选择RemixVM(shanghai)即可。每次使用,RemixIDE都会自动生成15个模拟账户地址供测试者使用。在本智能合约中,共需要一个卖家账户和若干个买家账户。点击账户地址右侧的复制图标可以将账户的地址复制到剪贴板。通过点击部署按钮将智能合约部署上链前,需要确认选择的账户是设定的卖家账户,合约部署后,该账户将被constructor函数自动设定为唯一的卖家。货运追踪区块链应用的使用选择第一个账户,然后点击部署按钮。部署成功后界面右下部分的命令窗口将会返回信息:货运追踪区块链应用的使用同时在部署&发交易面板下方,可以看到以部署的合约,点击右侧箭头展开可以显示编写在该合约中的所有函数:货运追踪区块链应用的使用根据前文中设定的交易流程,首先以卖家身份登记货物和库存。本任务中模拟一个有三种货物库存的场景:货物编号货物名称货物库存量0Huowu_1100001Huowu_2100002Huowu_310000货运追踪区块链应用的使用在createItem函数后的空格中分三次输入:Huowu_1,10000Huowu_2,10000Huowu_3,10000货运追踪区块链应用的使用每输入一组,点击一次函数的按钮来调用一次函数,三个货物共需要重复三次。每次成功调用函数,命令窗口中将会发送一条包含了交易记录,交易哈希和输入输出结果的信息。货运追踪区块链应用的使用此时,可以执行下方的getAllItems来查询已存在的货物列表,在函数按钮下方和命令窗口都将返回已经存在的货物列表:货运追踪区块链应用的使用通过系统返回的信息可以确定三种货物的库存已经生成:0,huowu_1,100001,huowu_2,100002,huowu_3,10000货运追踪区块链应用的使用因为在编写智能合约时先定了注册买家的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论