智能合约开发实战课件 单元5 设计与开发投票合约_第1页
智能合约开发实战课件 单元5 设计与开发投票合约_第2页
智能合约开发实战课件 单元5 设计与开发投票合约_第3页
智能合约开发实战课件 单元5 设计与开发投票合约_第4页
智能合约开发实战课件 单元5 设计与开发投票合约_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

智能合约开发实战单元5设计与开发投票合约任务5.1投票合约代码开发任务描述知识准备任务实现任务描述请实现一个去中心化投票平台,基于以太坊实现公司治理、社区选举和组织决策。选民通过数字身份参与投票,投票权重可按规则设定(如一人一票)。合约部署者(主席)分配投票权并监督投票过程。选民可以直接投票或委托他人投票,候选人名单由主席提供,整个投票过程公开透明。最终,合约自动计算得票数并宣布胜利者,所有结果在区块链上公开记录,确保公正和不易篡改。任务要求:1.选民授权:只有合约的主席(创建者)可以授权选民拥有投票权。每个选民只能被授权一次,并且只能投票一次。2.投票机制:选民可以通过直接投票选择候选人。选民投票时必须拥有投票权(weight>0)。选民在投票前不能已投过票。投票权重基于选民的授权状态,授权的选民有权利投票。3.委托投票:选民可以将自己的投票权委托给其他选民,无法委托给自己。委托投票时,委托链条需要被正确解析,且不能形成循环。如果委托的选民已投票,则委托选民的权重会转移到委托目标所选的候选人上。如果委托的选民尚未投票,委托的权重会增加到委托目标的投票权重中。4.候选人管理:选举的候选人由合约创建者在部署合约时指定。每个候选人都有一个姓名和一个得票数,投票时将更新相应候选人的得票数。5.选举结果:通过getWinner函数获取得票数最多的候选人以及其索引。知识准备

5.1.1数组5.1.2结构体数组5.1.3循环结构5.1.1数组数组是一种用于存储一组相同类型元素的数据结构,常用于组织和操作大量数据。数组的每个元素都有一个对应的索引(或下标),用于标识该元素的位置。通常,数组的索引从0开始,依次递增。例如,假设我们有一个名为arr的数组,用于存储10个整数。如图所示:1.数组的定义每个方格代表数组中的一个元素;在内存中,数组的元素是连续存储的,这使得访问数组中的元素非常高效。每个元素的索引标识其在数组中的位置,从0开始直到数组的大小减去1(例如,数组arr存储10个整数时,索引范围是从0到9)。5.1.1数组(1)静态数组静态数组的大小在编译时已经确定,一旦声明后,它的大小无法再进行修改。这里声明了一个大小为10的uint类型的静态数组,数组大小在编译时就已经确定,不能在运行时进行修改。(2)动态数组动态数组的大小是可以在运行时动态调整的,允许我们根据需要添加或删除元素。这声明了一个可变大小的uint类型的动态数组。与静态数组不同,动态数组的大小可以在运行时进行修改。2.数组声明5.1.1数组(1)静态数组初始化静态数组可以在声明时进行初始化,也可以在后续的代码中为其赋值。在这个例子中,我们声明并初始化了一个包含10个元素的静态数组,数组中的元素被赋予了初始值1到10。静态数组的大小是固定的,且必须与声明时的大小匹配。2)动态数组初始化动态数组可以使用new关键字进行初始化,并且可以指定其初始大小。初始化时,所有元素的值都会被默认设置为类型的零值(例如,uint的默认值是0)。3.数组初始化5.1.1数组动态数组提供了几个常用的方法来操作数组,尤其是push()和pop()方法,用于在数组末尾添加和删除元素。(1)向动态数组添加元素:上述示例中,调用push方法,在数组末尾添加元素4(2)删除动态数组中的元素:上述示例中,调用pop方法,删除数组中的最后一个元素4.动态数组的操作5.1.1数组代码示例【例5-1】静态数组的基本操作4.动态数组的操作5.1.1数组代码示例【例5-2】动态数组的基本操作4.动态数组的操作5.1.2结构体数组结构体数组则是一个由多个结构体实例组成的数组。通过结构体数组,可以更方便地管理一组相关的复杂数据。首先,我们定义一个结构体。例如,定义一个Person结构体来表示一个人:接下来,可以定义一个包含Person结构体的数组:people就是一个动态数组,包含多个Person结构体实例。你可以向数组中添加多个Person对象,进行访问、修改或删除。1.定义结构体数组5.1.2结构体数组操作结构体数组通常涉及以下几种常见操作:添加、访问、修改和删除元素。(1)添加元素代码示例【例5-3】使用不同方法向数组添加结构体2.操作结构体数组5.1.2结构体数组(2)访问元素通过数组索引来访问结构体数组中的元素。代码示例【例5-4】访问和检索结构体数组中的元素2.操作结构体数组5.1.2结构体数组(3)修改元素可以修改结构体数组中的元素,通过索引直接更新结构体的字段值。代码示例【例5-5】修改结构体数组中的元素2.操作结构体数组5.1.2结构体数组(4)删除元素删除结构体数组中的元素有两种常见方法:方法1:与最后一个元素交换并删除:这种方法通过将要删除的元素与数组中的最后一个元素交换,并使用pop()删除最后一个元素。这样可以减少数组的操作成本。2.操作结构体数组5.1.2结构体数组(4)删除元素删除结构体数组中的元素有两种常见方法:方法1:与最后一个元素交换并删除:这种方法通过将要删除的元素与数组中的最后一个元素交换,并使用pop()删除最后一个元素。代码示例【例5-6】与最后一个元素交换并删除2.操作结构体数组5.1.2结构体数组(4)删除元素删除结构体数组中的元素有两种常见方法:方法2:重置为默认值:使用delete关键字将数组中的某个元素重置为其类型的默认值,但不会改变数组的长度。代码示例【例5-7】重置为默认值2.操作结构体数组5.1.3循环结构for循环用于在特定条件下重复执行一段代码,它广泛应用于需要按顺序访问数组元素的场景。for循环的语法结构如下:-初始表达式:在循环开始前执行一次,通常用于初始化循环控制变量。-条件表达式:在每次迭代前进行评估,如果条件为true,则执行循环体;如果条件为false,则终止循环。-迭代表达式:在每次循环体执行后执行,通常用于更新循环控制变量。1.for循环5.1.3循环结构代码示例【例5-8】数组操作(求和、最大值)1.for循环5.1.3循环结构while循环只需一个条件表达式。它会在每次循环开始时评估条件,只有当条件为true时才会执行循环体。while循环的语法如下:条件表达式:每次迭代前评估,如果条件为true,则继续执行循环体;否则退出循环。2.while循环5.1.3循环结构代码示例【例5-9】数组操作与查找2.while循环5.1.3循环结构(1)break语句break语句用于立即退出最近的一个循环。不管循环的条件是否仍然为真,当执行到break语句时,循环将终止,程序的控制流将跳转到循环后面的第一条语句。3.控制流语句代码示例【例5-9】使用break语句查找数组中的第一个偶数5.1.3循环结构(2)continue语句continue语句用于跳过当前的循环迭代,并继续执行下一次迭代。也就是说,当执行到continue语句时,循环的剩余部分将被跳过,程序的控制流将跳回到循环的开始处,进行下一次迭代。3.控制流语句代码示例【例5-10】使用continue语句计算数组中所有奇数的和任务实现步骤1:定义合约和结构体步骤2:定义构造函数步骤3:编写授权选民函数步骤4:编写委托投票函数步骤5:编写投票函数步骤6:编写获取胜出候选人函数任务实现首先,我们定义了Ballot合约,它包含了两个主要的结构体:Voter和Candidate。-Voter结构体:用于存储每个选民的信息,包括投票权重、是否已经投票、委托投票的地址以及投票的候选人索引。-Candidate结构体:用于存储候选人的信息,包括候选人的姓名和得票数。合约还定义了合约创建者(主席)的地址chairperson,并通过mapping机制将选民的地址映射到其对应的Voter结构体。此外,我们使用Candidate[]数组来存储所有候选人的列表。步骤1:定义合约和结构体任务实现在合约构造函数中,初始化了合约。构造函数接收一个候选人姓名的数组candidateNames,并创建相应数量的Candidate结构体实例。合约的创建者(即主席)被赋予1票的投票权,并被标记为已经授权投票。所有候选人从传入的姓名列表中初始化,初始时每个候选人的得票数为0。步骤2:定义构造函数任务实现在这一步中,定义了一个authorize函数,主席可以使用该函数为选民授权投票权。具体的授权规则包括:只有合约的创建者(主席)才能调用此函数。选民必须尚未投票。选民不能重复被授权投票。当满足上述条件时,选民的投票权重weight被设置为1,意味着他们可以在选举中投票。步骤3:编写授权选民函数任务实现委托投票功能使选民可以将自己的投票权委托给其他选民进行投票。实现了如下逻辑:-选民不能将投票权委托给自己。-委托投票过程中,必须确保没有形成委托循环(例如A委托给B,B然后委托给A)。-如果委托目标已经投票,则该目标候选人获得选民的投票权重。-如果委托目标尚未投票,则该目标的投票权重会增加,直到他们投票为止。步骤4:编写委托投票函数任务实现在这一步中,定义了一个vote函数,允许选民直接选择某个候选人进行投票:-选民必须尚未投票。-选民投票后,投票权重weight被增加到选定候选人的得票数。-每个选民只能投一次票,因此投票后会标记该选民已经投票。这个函数是实际投票的核心逻辑,保证每个选民只能投票一次,并且候选人的得票数会根据选民的投票权重增加。步骤5:编写投票函数任务实现最后,我们定义了一个getWinner函数,用于返回得票最多的候选人及其索引。通过遍历所有候选人,查找voteCount(得票数)最高的候选人,并记录该候选人的索引和姓名。步骤6:编写获取胜出候选人函数任务5.2使用FISCOBCOS控制台部署合约任务描述知识准备任务实现任务描述通过控制台部署并测试智能合约,以实现一个简单的投票系统。合约部署成功后,我们将进行一系列操作,包括创建账户、授权投票、投票以及获取当前胜出候选人。具体要求如下:1.部署合约-创建账户:执行newAccount命令两次创建两个账户。-查看账户列表:执行listAccount命令查看当前的账户列表。-部署合约:部署合约时,合约初始化需要输入候选人名单["Alice","Bob","Charlie"]。2.测试合约功能-授权投票:调用authorize方法给两个账户授权。-投票:调用vote方法进行投票,包括给“Bob”和“Charlie”投票。每次投票前需要切换到相应的账户。-获取当前的胜出候选人:调用getWinner方法获取当前的胜出候选人索引和姓名。知识准备

5.2.1FISCOBCOS介绍5.2.2安装FISCOBCOS区块链5.2.3FISCOBCOS控制台介绍5.2.4安装FISCOBCOS控制台5.2.1FISCOBCOS介绍FISCOBCOS是由深圳市金融区块链发展促进会开源工作组牵头研发的金融级、国产安全可控的区块链底层平台。作为最早开源的国产联盟链底层平台之一,FISCOBCOS于2017年面向全球开源,旨在为金融和其他行业提供一个高性能、安全、灵活的区块链解决方案。该平台不仅支持金融行业,还涵盖了供应链、物联网、智慧城市等多个业务场景。FISCOBCOS的架构由多个核心组件构成,确保其功能的完整性和灵活性:-节点(Node):作为区块链网络的基础组成部分,负责处理交易、执行智能合约、维护账本数据等。-群组(Group):支持多群组架构,不同的群组可以分别处理不同的业务逻辑和数据。-区块链浏览器(BlockchainExplorer):提供可视化界面,用户可以方便地查询区块、交易、账户等信息。-SDK:提供多种语言的SDK,如Java、Python等,方便开发者进行区块链应用开发。-Console控制台:提供命令行工具,用户可以通过Console控制台与区块链网络交互,进行节点管理、智能合约操作、数据查询等。5.2.2安装FISCOBCOS区块链通过以下命令可以在本地搭建一个包含4个节点的联盟链:-l:4:指定在本地地址上搭建4个节点的链。-p30300,20200,8545:指定每个节点的端口:-30300:P2P通信端口。-20200:RPC通信端口。-8545:Channel端口,用于Web3SDK等客户端连接。-e./fisco-bcos:指定FISCOBCOS可执行文件的路径。1.搭建4节点联盟链mkdir~/fisco&&cd~/fiscocurl-#LO/FISCO-BCOS/FISCO-BCOS/releases/download/v2.11.0/build_chain.sh&&chmodu+xbuild_chain.shbashbuild_chain.sh-l:4-p30300,20200,8545-e./fisco-bcos5.2.2安装FISCOBCOS区块链进入FISCOBCOS安装目录,执行以下命令重新启动所有节点:启动成功会输出如下信息:2.启动FISCOBCOS链cd~/fisco&&bashnodes//start_all.sh5.2.2安装FISCOBCOS区块链确认节点进程是否正常启动,使用以下命令检查:正常情况会有类似下面的输出,如果进程数不为4,则进程没有启动(一般是端口被占用导致的)3.检查节点进程psaux|grep-vgrep|grepfisco-bcos5.2.3FISCOBCOS控制台介绍FISCOBCOS控制台是一个功能强大的命令行工具,用于管理和操作FISCOBCOS区块链网络。它提供了丰富的命令和功能,帮助用户进行节点管理、智能合约操作、数据查询等任务。以下是FISCOBCOS控制台的功能:-节点管理:允许用户查看节点状态、配置节点参数等。-智能合约管理:支持部署、调用和查询智能合约。-区块链数据查询:可以查询区块、交易、账户等信息。-系统管理:包含节点日志查看、系统配置等功能。-多群组管理:支持对不同群组进行管理和操作。5.2.4安装FISCOBCOS控制台FISCOBCOS控制台提供了向FISCOBCOS节点部署合约、发起合约调用、查询链状态等功能。控制台运行需要Java环境(推荐使用Java14)。安装命令如下:(1)ubuntu系统安装java(2)查询Java版本1.安装依赖sudoaptinstall-ydefault-jdkjava-version5.2.4安装FISCOBCOS控制台(1)找到JavaJDK的安装路径使用以下命令查找具体路径:输出结果类似于:/usr/bin/java,记下Java安装路径/usr,后续需要用到这个路径来配置JAVA_HOME。(2)编辑环境变量文件使用vim编辑~/.bashrc文件:2.配置JAVA_HOME环境变量whichjavavim~/.bashrc(3)添加JAVA_HOME环境变量在文件末尾添加以下内容,并将路径替换为实际的Java安装路径:(4)刷新环境变量保存并关闭文件后,运行以下命令以使更改生效:(5)验证JAVA_HOME配置运行以下命令验证JAVA_HOME是否配置正确:exportJAVA_HOME=/usrexportPATH=${JAVA_HOME}/bin:$PATHsource~/.bashrcecho$JAVA_HOME5.2.4安装FISCOBCOS控制台接下来,请访问官网下载压缩包,解压缩FISCOBCOS控制台并进行安装。具体步骤如下:3.解压控制台cd~/fisco&&tar-zxvfconsole.tar.gz5.2.4安装FISCOBCOS控制台(1)拷贝控制台配置文件将控制台的示例配置文件复制为实际配置文件:(2)配置控制台证书控制台需要证书才能连接FISCOBCOS节点。开发建链脚本在生成节点时会自动生成SDK证书,可以直接使用这些证书。将生成的证书拷贝到控制台的配置目录中:4.配置控制台cp-nconsole/conf/config-example.tomlconsole/conf/config.tomlcp-rnodes//sdk/*console/conf5.2.4安装FISCOBCOS控制台执行以下命令:输出下述信息表明启动成功,否则请检查conf/config.toml中节点端口配置是否正确。5.启动控制台cd~/fisco/console&&bashstart.sh5.2.4安装FISCOBCOS控制台(1)编写合约代码首先,创建一个名为SimpleStorage.sol的文件,并将以下合约代码保存到该文件中:6.部署合约5.2.4安装FISCOBCOS控制台(2)将合约文件保存到指定目录将SimpleStorage.sol文件保存到~/fisco/console/contracts/solidity目录下。(3)使用FISCOBCOS控制台部署合约打开FISCOBCOS的控制台,然后使用deploy命令来部署合约。执行以下命令:部署成功后,控制台将输出类似以下的信息:transactionhash是部署交易的哈希值。contractaddress是成功部署的合约地址。currentAccount是当前账户地址。6.部署合约deploySimpleStorage.sol5.2.4安装FISCOBCOS控制台(1)准备工作确保你已经在控制台部署了SimpleStorage合约,并且记下了合约地址(2)调用合约的set函数使用控制台命令调用set函数来存储一个新的值(例如:123)。该命令的格式是:运行成功后,会返回交易哈希值:7.调用合约callSimpleStorage0x1d38f5d0c8c1ae7ed63a2d0ec905b9e9a17e70cfset123call<合约名><合约地址><函数名><参数>5.2.4安装FISCOBCOS控制台(3)调用合约的get函数使用控制台命令调用get函数来读取存储的值运行成功后,会返回存储的值:7.调用合约callSimpleStorage0x1d38f5d0c8c1ae7ed63a2d0ec905b9e9a17e70cfget任务实现步骤1:部署合约步骤2:测试合约功能任务实现首先,我们需要将合约文件保存至~/fisco/console/contracts/solidity/Ballot.sol,然后通过控制台执行一系列命令来创建账户、查看账户列表并部署合约。(1)创建账户:执行2次newAccount命令创建2个账户。(2)查看账户列表:执行listAccount命令查看当前账户列表,你会看到一个包含三个账户的列表。默认情况下,使用第一个账户作为合约的部署地址。以下是账户信息:步骤1:部署合约newAccountnewAccountlistAccount任务5.3使用WeBASE部署合约任务描述知识准备任务实现任务描述该任务涉及在WeBASE-Front平台上部署和执行一个选举合约。合约的目标是管理一个学生会的选举程序,其中包含候选人注册、投票权限授予、投票、委托投票以及查询当前胜出候选人和获取候选人姓名的功能。以下是详细的任务描述:1.合约部署添加测试用户:在WeBASE-Front界面中添加测试用户,以模拟真实的投票参与者。编辑合约代码:在合约IDE中创建新合约文件,并输入智能合约代码。部署合约:主席需要在WeBASE-Front平台上部署一个选举智能合约。合约在部署时需要接收一个初始参数,即一个包含三位候选人姓名的数组["Alice","Bob","Charlie"]。2.测试合约功能授予投票权:部署合约后,主席需要调用authorize函数,为student1、student2、student3等选民授予投票权。投票:student1、student2和student3需要登录到WeBASE-Front平台,在自己的账号下对候选人进行投票或委托投票。查询结果:任何人都可以调用getWinner函数查询当前的领先候选人索引和候选人的姓名。知识准备

5.3.1WeBASE介绍5.3.2节点前置服务搭建5.3.3使用WeBASE-Front节点前置的页面5.3.1WeBASE介绍WeBASE(WeBankBlockchainApplicationSoftwareExtension)是一个在区块链应用和FISCOBCOS节点之间搭建的通用组件框架。该框架围绕交易、智能合约、密钥管理、

温馨提示

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

评论

0/150

提交评论