智能合约开发实战课件 单元2 设计与实现会员积分合约_第1页
智能合约开发实战课件 单元2 设计与实现会员积分合约_第2页
智能合约开发实战课件 单元2 设计与实现会员积分合约_第3页
智能合约开发实战课件 单元2 设计与实现会员积分合约_第4页
智能合约开发实战课件 单元2 设计与实现会员积分合约_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

智能合约开发实战单元2设计与实现会员积分合约任务2.1会员积分合约代码开发任务描述知识准备任务实现任务描述这次任务的目标是创建一个基于区块链的智能合约,用来管理会员积分。通过利用区块链技术的去中心化和透明性,智能合约可以为会员提供一个公平、公正的积分管理平台,确保每笔积分的获得和转移都能被准确记录,从而增强会员对系统的信任感。以下是具体的任务要求:1.定义合约:首先,我们需要创建一个名为Coin.sol的文件,在这个文件中定义智能合约的基本结构。2.定义状态变量:在合约中,我们将定义一个balances状态变量,用来存储每个会员的积分余额。3.实现领取积分功能:在智能合约中创建一个mint函数,商家可以通过这个函数为特定会员发放一定数量的积分。4.实现发送积分功能:创建一个send函数,会员可以通过它把积分转移到其他会员的账户中。5.编译并部署合约:使用RemixIDE来编写和编译Coin.sol合约,然后在RemixVM环境中部署这个合约。6.调用合约函数:-商家调用mint函数,为会员A增加100积分。-商家调用mint函数,为会员B增加200积分。-会员A调用send函数,向会员B转移50积分。知识准备

2.1.1合约类型2.1.2整数类型2.1.3地址类型2.1.4映射类型2.1.5代码注释2.1.1合约类型合约(Contract)是一种重要的数据类型,类似于面向对象编程中的类。它用于定义智能合约的行为和状态。下面是关于合约类型的基本语法:MyContract是合约的名称。合约中可以包含状态变量、函数等内容。基本语法contractMyContract{//合约中的状态变量和函数}2.1.1合约类型(1)避免冲突合约的名称应避免与现有的合约名、库名或Solidity保留关键字发生冲突。如果使用了已有的名称,可能会导致编译错误或不必要的混淆。1.合约中的命名规则2.1.1合约类型(2)采用驼峰命名法合约的名称通常采用驼峰命名法,也就是每个单词的首字母大写(例如MySmartContract)。这种命名风格使代码看起来整洁且易于阅读,特别是在函数和变量名较长时,能够清楚地分隔各个词汇。(3)避免使用特殊字符合约名称应该由字母、数字和下划线组成,避免使用空格、连字符或其他特殊符号。特殊字符会影响合约的解析和编译,甚至会导致部署失败。例如,合约名称中不能有空格或连字符,像My-Token或mytoken都是不合法的。(4)不要以数字开头合约名称不应以数字开头。虽然可以在名称中使用数字,但以数字开头会导致命名习惯上的不便和潜在的冲突。比如,2022Token不是一个推荐的名称,Token2022更符合命名规范。(5)区分大小写合约名称是区分大小写的,因此MyTokenContract和mytokencontract会被视为两个不同的名称。因此,在命名时要注意大小写的一致性,保持清晰和统一。1.合约中的命名规则2.1.1合约类型状态变量是智能合约中的一种重要数据类型,用于存储合约的状态信息。可以把它们想象成合约的“记事本”,用来保存合约在不同时间的状态或数据。状态变量的主要特征如下:存储信息:状态变量用来保存合约的具体信息,比如余额、投票数、用户地址等。这些信息会一直存在于区块链上,直到被更新。全局可访问:状态变量一旦定义,合约中的所有函数都可以访问和修改它们。这意味着可以在合约的任何地方使用这些数据。永久保存:与普通变量不同,状态变量的值是永久存储在区块链上的。即使合约被调用多次,这些变量的值也不会消失。2.合约中的状态变量contractMyContract{uintpublicmyVariable;}例如,在以下代码中:myVariable是一个状态变量,类型是uint(无符号整数),并且设置为public,意味着合约外部可以查看这个变量的值。2.1.1合约类型合约中的函数是用来定义合约的行为和操作的代码块。可以把它们想象成合约的“指令”,用来执行特定的任务。例如:myFunction是一个公共函数,使用public修饰符表示该函数可以被外部调用。关于函数的知识我们将在下一章详细介绍。3.合约中的函数代码示例【例2-1】合约类型的示例-合约名称:MyContract是我们创建的合约名称,类似于一个类的名字。-状态变量:myVariable是一个状态变量,用来存储一个无符号整数(uint)的值,并且被设置为public,这意味着它可以被合约外部查看。-函数定义:setMyVariable是一个公共函数,允许外部调用者传入一个新的值newValue来更新myVariable的值。这个函数的目的是提供一种方式来修改合约的状态。contractMyContract{functionmyFunction()public{//函数的具体实现}}2.1.2整数类型无符号整数只能存储非负数。它们的声明形式是uint加上数字,表示位数。1.无符号整数类型(uint)代码示例【例2-2】无符号整数类型定义及初始化以上代码定义了一个名为Example的智能合约,包含两个无符号整数状态变量:-myUint:类型为uint256,初始值为42。-smallUint:类型为uint8,初始值为255。2.1.2整数类型有符号整数可以表示正数、负数或零,类型声明为int后加数字,例如int256是256位的有符号整数。2.有符号整数类型(int)代码示例【例2-3】有符号整数类型定义及初始化以上代码定义了一个名为Example的智能合约,包含两个有符号整数状态变量:-myInt:类型为int256,初始值为-42。-smallInt:类型为int8,初始值为127。2.1.2整数类型(1)算术运算符算数运算符用于进行基本的数学计算,包括加法、减法、乘法、除法等操作3.整数类型的运算2.1.2整数类型(2)比较运算符比较运算符用于比较两个整数的大小,结果返回布尔值true或false3.整数类型的运算2.1.2整数类型代码示例【例2-4】整数类型运算3.整数类型的运算2.1.3地址类型地址类型在以太坊中用于表示账户地址,可以用于与其他智能合约进行交互。地址是一个固定长度的20字节(160位)字节数组,通常以十六进制形式表示,前缀为“0x”,后面跟随40个十六进制字符。以下是地址类型的语法和常见用法address:变量的类型,用于存储以太坊地址。visibility:可见性修饰符,例如public、internal、private等。name:变量的名称。基本语法代码示例【例2-5】地址类型的声明与赋值addressvisibilityname;2.1.4映射类型映射(mapping)用于在以太坊智能合约中存储键值对。基本语法如下:keyType:键的类型,目前只能是以下几种:uint、address、bytes和string等。键类型不能是复合类型,比如另一个映射、数组、结构体等。valueType:值的类型,可以是任何类型,包括另一个映射、数组、结构体等。visibility:可见性修饰符,例如public、internal、private等。name:映射的名称。1.映射的声明-映射名:balances。-Key:address类型,用于唯一标识每个账户。-Value:uint类型,表示账户的余额。例如,地址0xAbc123的余额为100,地址0xDef456的余额为200,地址0xGhi789的余额为50。mapping(keyType=>valueType)visibilityname;2.1.4映射类型设置映射值的语法如下:mappingName:映射的名称。key:要更新的键。value:要设置的新值。2.设置与获取映射值获取映射值的语法如下:value:接收映射中查找到的值。mappingName:映射的名称。key:要查询的键。代码示例【例2-6】声明、设置和获取映射中的值mappingName[key]=value;value=mappingName[key];2.1.5代码注释(1)单行注释单行注释用于简短说明,格式为//开头,后面跟随注释内容。1.单行注释和多行注释代码示例【例2-7】单行注释(2)多行注释多行注释用于较长说明或复杂逻辑,格式为/*开始,*/结束,可以跨越多行。2.1.5代码注释文档注释用于生成自动化文档,通常使用Natspec格式,格式为/**开始,*/结束,通常位于合约、函数、事件或变量之前。2.文档注释代码示例【例2-9】单行注释@title:合约或函数的标题。@dev:开发者说明,描述合约或函数的具体实现。@param:描述函数参数,格式为@param参数名参数描述。@return:描述函数的返回值,格式为@return返回值描述。任务实现步骤1:定义合约步骤2:定义状态变量步骤3:实现领取积分函数步骤4:实现发送积分函数步骤5:编译合约并部署合约步骤6:调用合约函数任务实现在“功能操作区”中,单击contracts目录,接着单击“新建文件”按钮,输入文件名Coin.sol,然后按Enter键,创建一个名为Coin.sol的文件,并编辑以下代码:pragmasolidity^0.6.10是指定Solidity编译器版本的声明。contractCoin{}是创建一个名为Coin的合约的声明。步骤1:定义合约任务实现在合约中定义balances状态变量,用于存储每个地址对应的会员积分余额address:这是映射的键类型,用于表示以太坊地址,通常是用户或合约的地址。uint:这是映射的值类型,用于表示无符号整数,表示对应地址的积分余额。public:这意味着该映射可以被外部合约和用户访问。步骤2:定义状态变量任务实现定义领取积分的函数,接受“会员地址”和“积分数量”两个参数,并在balances中添加数据receiver是接收积分的地址。amount是要分配的积分数量。步骤3:实现领取积分函数任务实现定义发送积分函数,输入“会员地址”和“积分数量”两个参数,修改状态变量balances中发送者和接受者的数据。msg.sender是当前调用这个函数的地址,也就是发送积分的人。receiver是接收积分的地址。步骤4:实现发送积分函数任务实现单击“功能切换区”的“Solidity编译器”按钮,单击“编译”按钮单击“功能切换区”的“部署&发交易”按钮,然后单击“部署”按钮部署合约步骤5:编译合约并部署合约任务实现部署合约后会发起一笔创建合约交易,交易完成后,会在链上生成一个合约地址,同时在右下方控制台/日志区看到交易详情步骤5:编译合约并部署合约任务实现单击“功能操作区”中的合约地址下拉框,将会显示该合约所有可调用的函数,包括mint、send和balances步骤6:调用合约函数任务实现1.商家调用mint函数给会员A发送积分(1)单击账户区域的下拉框,任意选取2个地址分别作为会员A和会员B的账户地址;单击mint函数右侧的下拉框,在receiver一栏中输入会员A的地址,在amount一栏中输入积分数量,最后单击transact按钮调用mint函数。(2)将会员A的地址作为参数,然后单击balances按钮,返回值为100,表示会员A的余额为100步骤6:调用合约函数任务实现(2)将会员A的地址作为参数,然后单击balances按钮,返回值为100,表示会员A的余额为100步骤6:调用合约函数任务实现2.商家调用mint函数给会员B发送积分(1)单击mint函数右侧的下拉框,在receiver一栏中输入会员B的地址,在amount一栏中输入积分数量,最后单击transact按钮调用mint函数(2)将会员B的地址作为参数,然后单击balances按钮,返回值为200,表示会员B的余额为200步骤6:调用合约函数任务实现3.会员A调用send函数给会员B发送积分(1)首先切换到会员A的账户,然后单击send函数右侧的下拉框,在receiver一栏中输入会员B的地址,在amount一栏中输入积分数量,最后单击transact按钮调用send函数。步骤6:调用合约函数任务实现(2)将会员B的地址作为参数,然后单击balances按钮,查询到会员B的余额为250(3)将会员A的地址作为参数,然后单击balances按钮,查询到会员A的余额为50步骤6:调用合约函数任务2.2使用Truffle框架部署合约任务描述知识准备任务实现任务描述本任务旨在使用Truffle框架在以太坊区块链上部署和测试任务2.1中的积分合约(Coin合约),具体分为以下几个步骤:1.创建Truffle项目:创建一个新的目录truffleCoinTest,然后使用truffleinit初始化项目。2.智能合约编写:编写一个名为Coin.sol的智能合约并保存到contracts目录。3.迁移脚本编写:在migrations目录下创建一个新的迁移脚本1_deploy_Coin.js用于部署Coin智能合约。4.配置环境:-修改truffle-config.js配置文件以连接到本地的以太坊网络(例如使用Ganache)。-设置合约编译时所需的Solidity编译器版本,以匹配智能合约代码中指定的版本。5.编译和部署合约:使用trufflemigrate命令将智能合约部署到本地的以太坊网络。6.调用合约函数:-调用mint函数:验证合约的积分发行功能。-调用send函数:验证合约的积分发送功能。知识准备

2.2.1Truffle控制台2.2.2迁移脚本2.2.1Truffle控制台truffleconsole是一个交互式的JavaScript控制台,允许开发者与部署在以太坊网络上的智能合约进行交互。主要功能如下:与智能合约交互:可以调用已部署的智能合约的函数,获取合约状态,发送交易等。测试和调试:在测试网络环境中运行和调试智能合约。部署合约:可以使用truffleconsole部署新的智能合约。发送交易:发送以太坊交易,进行账户之间的转账。在Truffle项目目录中,运行以下命令启动:基本概念truffleconsole2.2.2迁移脚本每个迁移脚本都是一个JavaScript文件,通常位于migrations/目录中,文件名以数字开头,这个数字表示脚本的执行顺序。例如,1_initial_migration.js是第一个执行的脚本。一个典型的迁移脚本如下:1.基本结构constMyContract=artifacts.require("MyContract");module.exports=function(deployer){//部署逻辑deployer.deploy(MyContract,param1,param2);};artifacts.require函数引入名为MyContract的智能合约。并返回一个合约对象,允许后续的部署和交互。第一个MyContract(在constMyContract里):这是一个变量名,表示要创建的常量。第二个MyContract(在artifacts.require("MyContract")里):这是artifacts.require方法的参数,表示要导入的合约的名称。param1和param2是传递给合约构造函数的参数。2.2.2迁移脚本deployed方法通常用于获取最新一次部署到区块链上的合约实例使用await可以确保这些操作按预期的顺序执行。如果不使用await,可能会在合约还未部署完成时尝试获取实例或调用方法,导致错误。(1)在迁移脚本中的使用右图是一个简单的Solidity合约示例,可以存储和读取一个uint类型的数值。假设合约文件命名为MyContract.sol,将其保存在contracts目录下。2.deployed方法constinstance=awaitMyContract.deployed();2.2.2迁移脚本对应的Truffle部署脚本1_deploy_contracts.js如下:2.deployed方法2.2.2迁移脚本(2)在Truffle控制台中的使用①启动Truffle控制台:②在控制台中获取已部署的合约实例并与之交互2.deployed方法truffleconsole2.2.2迁移脚本try...catch语句是JavaScript中用于处理异常的结构。它允许开发者在代码运行期间捕获并处理错误,从而防止程序崩溃并提供更好的用户体验。以下是try...catch语句的基本语法:3.try...catch语句try{//可能会抛出错误的代码块}catch(error){//处理错误的代码块}在try块中放置可能会抛出错误的代码。如果该代码抛出错误,执行将立即跳转到catch块。如果没有错误发生,try块中的代码将正常执行完毕,跳过catch块。catch块用于捕获并处理try块中抛出的错误。erro

温馨提示

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

评论

0/150

提交评论