区块链案例实践学习报告_2
宠物商店实现原理
- 编写智能合约
- 智能合约的生命周期
- 智能合约运行流程
- 宠物商店运行原理解释
- 1.部署合约
- 2. 利用web3来和合约进行交互
- 3.用metamask导入本地区块链网络
- 说明
上次虽然实现了宠物商店的案例,但对于这个案例是怎么运行的却依然感到陌生。为了进一步熟悉以太坊智能合约的原理,就有了这篇学习报告。
编写智能合约
智能合约承担着分布式应用的后台逻辑和存储。contract目录下存放的是智能合约的Solidity源文件(.sol)。其中包含了两个文件一个是initialization时生成的Migrations.sol,另一个是添加的Adoption.sol(实现领养功能的智能合约)。
- Migrations.sol
作为初始迁移合约,Migrations.sol一般不需要修改,其用途是声明这个合约的所有者。
通过Ganache查看部署在本地区块链的合约中,我们可以看到
owner:"0x0590139670D0707De507ED6F8862AF66cC839c82"
合约Migrations所拥有的地址类型变量owner存储的发送者的账号地址。
方法setComplicated用于对存储于storage的无符号整型类型的变量last_completed_migration进行赋值。其中它是用来前面声明的modify 方法rescrited,使得变量last_completed_migration的值只能被发送者修改,其他账户在读取这个合约时,只拥有访问权限,而不能修改。
- Adoption.sol
现在让我们来看,另一个合约Adoption。
首先,定义了一个地址变量数组
address[16] public adopters; // 保存领养者的地址
它在区块链中存储情况是这样的
地址1,2 中之所以不是空,是因为我用那两个账号分别收养了一只宠物
然后,
function adopt(uint petId) public returns (uint) {require(petId >= 0 && petId <= 15); // 确保id在数组长度内adopters[petId] = msg.sender; // 保存调用这地址 return petId;}
这个方法的功能是领养宠物,记录收养者的地址。如上图中,petID为1和2的地址变量已经有了收养者的地址。
使用require()语句确保petID在范围内。petID在范围内时,我调用adopters数组的地址将调用此函数的账户地址表示为msg.sender。将petId作为确认返回。
// 返回领养者function getAdopters() public view returns (address[16] memory) {return adopters;}
界面UI需要更新所有宠物采用状态,通过这个方法来返回Adopers数组。
智能合约的生命周期
Solidity编译为字节码,以便执行以太坊虚拟机(EVM)执行
智能合约运行流程
1)智能合约对外,以账户的形式呈现,这个账户余额之外,还存储了智能合约代码(编译后的字节码),以及该账户拥有的状态数据。
2)部署智能合约的过程就是一个向"0”地址发送一笔带有智能合约字节码数据交易的过程。这笔特殊的交易会生成该智能合约的地址,并将字节码存储在该地址下的状态树中。
3)执行智能合约的过程(调用智能合约函数的过程),调用智能合约函数是向该智能合约地址发送一个交易,该交易包含被调用的智能合约函数信息及调用参数。
4)智能合约地址收到调用合约函数的交易,首先会解码数,根据结果查找到对应函数的入口,再传入参数执行该函数。
5)执行函数的过程是状态转换的过程,执行完成后会扣除调用者相应的费用(Gas)。
6)状态转换的过程会全网同步并被再次执行验证,以确保执行结果一致,这样通过验证后的交易会记录到区块中,同时更新状态数据。
7)此时保存到区块链上的交易还不“安全”,因为Pow的识机制原因,可能存在链分叉,这笔交易可能会重新打回到交易池,但是后面不断增加的区块还会对前面的交易进行“投票”,当在该区块高度之后增加12个区块高度时,就可以认为该区块不可能被分叉,上面的交易得到最终确认,不可能被篡改了。
宠物商店运行原理解释
基于此,开始对宠物商店的原理进行解释。
1.部署合约
交易存储了发送者要发送至以太坊网络的经过签名的信息,它其中包含了从一个账户要传递给另一个账户(或者合约)的信息。在以太坊中,有两种类型的交易:一种是能够产生消息调用的交易,另一种是能够生成新账户的交易(比如说生成合约)。
通过部署合约,区块链创建了Addoption的地址
0xe4641e032dD85B23
2. 利用web3来和合约进行交互
web3是一个实现了与以太坊节点通信的库。在Truffle Box pet-shop里,已经包含了应用的前端代码,代码在src/文件夹下修改src/js/app.js,实现了以下几个功能
- 实例化web3:让它能连接到MetaMask(以太坊钱包);
- 实例化合同:Truffle有一个图书馆来帮助这个叫做truffle-contract。它使合同信息与迁移保持同步,因此无需手动更改合同的部署地址;
- 修改markAdopted():
a)访问已部署的Adoption合同,然后调用getAdopters()该实例。然后
b)adoptionInstance在智能合约调用之外声明变量,以便我们可以在最初检索它之后访问该实例。
c)用call读取信息不用消耗gas。
d)调用getAdopters(),adopters数组,检查是否为每只宠物存储了一个地址。
e)一旦petId找到具有相应地址的地址,我们将禁用其采用按钮并将按钮文本更改为“成功”。
f)将错误都会记录到控制台。- 修改handleAdopt():
a)使用web3来获取用户的帐户。
b)如果错误,则回调
d)然后选择第一个帐户像上面那样获得部署的合同并存储实例adoptionInstance。
e)发送一个交易,同时交易需要从地址获取gas。
f)执行adopt()包含宠物ID和包含我们之前存储的帐户地址的对象的函数来发送交易account。
h)如果没有错误,我们继续调用markAdopted()函数来将UI与我们新存储的数据同步。
3.用metamask导入本地区块链网络
让钱包能够连接到网络。
然后导入账号,每个账号都有公钥地址和私钥。
利用account3进行收养操作
利用Ganache查看交易
mined in 32 表示,交易已经被打包到区块32中
我们可以看到这个交易中接收者的地址
0xe4641e032dD85B236E79dAcA395992a78A001016
即Adoption合约的地址。
说明
因为,这个区块链上只有这一个节点,就是本机,所以本机是唯一的矿工节点。但因为是部署在本地的,所以本机在进行挖矿时,没有挖矿奖励,也没有共识机制的验证。
区块链案例实践学习报告_2相关推荐
- 区块链案例实践报告_1_DAPP宠物商店
本文为个人学习报告,不做他用. 关于宠物商店的教程,网上已经给出了许多.因此,本文并不会十分详细地讲解具体操作,只是简述开发流程. 具体的实现步骤可参考 文字教程:https://www.jiansh ...
- 产业复苏|2020区块链与数字经济高峰论坛暨区块链战“疫”报告线上发布会召开...
4月26日,产业复苏|2020区块链与数字经济高峰论坛暨区块链战"疫"报告线上发布会在北京隆重召开,本次大会通过线上形式举办. 本次大会在中国移动通信联合会区块链专委会.中国电子商 ...
- 陀螺财经携百家产业合作伙伴推出“史上最强产业区块链案例集”
自去年12月陀螺财经宣布升级产业区块链服务,重磅上线"陀螺财经产业区块链平台"以来,我们已为超过200家区块链企业提供品牌信息发布.产业咨询.资源对接与技术解决方案一站式服务. 产 ...
- 【区块链】研究报告:2018年中国区块链行业应用报告
近日,中国区块链基础服务联盟发布<2018年中国区块链行业应用报告>,报告总结了区块链技术的前世今生和发展历程,描述了全国300多家区块链企业的总体发展情况,并对区块链应用场景进行了深入的 ...
- 远望智库未来产业研究院与资本实验室联合发布《2021全球区块链应用市场报告》...
来源:远望智库预见未来 从以比特币为代表的区块链1.0时代:到以智能合约为媒介,以金融应用为核心的区块链2.0时代:再到区块链应用于政务服务和更广泛的各行业,并开始推动信息互联网向价值互联网靠拢,短短 ...
- 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google
近日,知名调研机构Gartner发布了全球领先公共云厂商区块链服务能力报告,作为唯一上榜的中国科技公司,阿里云获得六个评判维度的最高分,排名第二,仅次微软,领先AWS.Google等企业. Gartn ...
- 区块链成熟度评测报告
区块链成熟度评测报告(1)--功能性对比 区块链成熟度评测报告(2)--性能效率.安全性对比 区块链成熟度评测报告(3)--可靠性.易用性.可扩展性对比 区块链成熟度评测报告(4)--可维护性.兼容性 ...
- 2020区块链产业投融资报告:揭秘资本视角下的区块链行业|陀螺研究院 x IT桔子
区块链,是一种由多方共同维护,使用密码学保证传输和访问安全,能够实现数据一致存储.难以篡改.防止抵赖的分布式记账技术.2020年,在疫情的冲击中,区块链在非信环境下构建多方协同信任的能力倍受关注,慈善 ...
- 2020区块链产业投融资报告:揭秘资本视角下的区块链行业
区块链,是一种由多方共同维护,使用密码学保证传输和访问安全,能够实现数据一致存储.难以篡改.防止抵赖的分布式记账技术.2020年,在疫情的冲击中,区块链在非信环境下构建多方协同信任的能力倍受关注,慈善 ...
最新文章
- pip在windows下安装配件/宏包
- Hive Lateral View、视图、索引
- FIFO跨时钟域读写
- boost::stacktrace模块实现终止处理程序的测试程序
- boost::contract模块实现命名覆盖的测试程序
- leetcode 54. Spiral Matrix | 54. 螺旋矩阵(Java)
- 数学--数论-- HDU6298 Maximum Multiple 打表找规律
- Ping, IPConfig, Format, Netstat, etc. Not Recognized as Commands
- 限制用户擅自更改ip的方法
- shutil模块 python_python之模块之shutil模块
- 途观l怎么使用_官宣!中型SUV质量最新排名出炉:汉兰达失前三,大众途观L上榜!...
- 剑指offer:剪绳子(找规律,贪心算法,动态规划)
- php foreach 为什么在if条件下多条数据只取出一条数据_微信大牛教你深入了解数据库索引...
- 一题多解 —— $?(命令返回状态)的检验
- mysql 分页拦截器_MyBatis 拦截器 (实现分页功能)
- 如何在 Mac 上使用“接力”回到上次离开的地方?
- 兆骑科创平台创新创业赛事路演,投融资服务
- 多数据源的配置,详细(新手,错误之处,请指正)
- 在整车OTA上,为啥新能源车企反而比传统车企做的更好?
- cout 声明与定义
热门文章
- git-新手入职必备操作流程
- python win32.com对excel的基本操作
- 从头开始学MySQL--------内连接、左连接、右连接(4)
- LeetCode-maximal-rectangle(最大矩阵面积)
- 仿微信图片缩放效果以及listview反弹效果
- Linux安全运维学习⑤ ---- yum工具进行软件的安装与卸载 (与依赖关系列表理解)
- new tech 201602
- To install it, you can run: npm install --save element-ui/lib/theme-chalk/index.css
- round在python是什么意思_python – round()和numpy.round()之间的底层差异是什么?
- 上班时间久了右肩膀总是疼怎么回事?