宠物商店实现原理

  • 编写智能合约
  • 智能合约的生命周期
  • 智能合约运行流程
  • 宠物商店运行原理解释
    • 1.部署合约
    • 2. 利用web3来和合约进行交互
    • 3.用metamask导入本地区块链网络
    • 说明

   上次虽然实现了宠物商店的案例,但对于这个案例是怎么运行的却依然感到陌生。为了进一步熟悉以太坊智能合约的原理,就有了这篇学习报告。

编写智能合约

  智能合约承担着分布式应用的后台逻辑和存储。contract目录下存放的是智能合约的Solidity源文件(.sol)。其中包含了两个文件一个是initialization时生成的Migrations.sol,另一个是添加的Adoption.sol(实现领养功能的智能合约)。

  1. Migrations.sol

作为初始迁移合约,Migrations.sol一般不需要修改,其用途是声明这个合约的所有者。

通过Ganache查看部署在本地区块链的合约中,我们可以看到

owner:"0x0590139670D0707De507ED6F8862AF66cC839c82"

合约Migrations所拥有的地址类型变量owner存储的发送者的账号地址。
方法setComplicated用于对存储于storage的无符号整型类型的变量last_completed_migration进行赋值。其中它是用来前面声明的modify 方法rescrited,使得变量last_completed_migration的值只能被发送者修改,其他账户在读取这个合约时,只拥有访问权限,而不能修改。

  1. 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,实现了以下几个功能

  1. 实例化web3:让它能连接到MetaMask(以太坊钱包);
  2. 实例化合同:Truffle有一个图书馆来帮助这个叫做truffle-contract。它使合同信息与迁移保持同步,因此无需手动更改合同的部署地址;
  3. 修改markAdopted():
    a)访问已部署的Adoption合同,然后调用getAdopters()该实例。然后
    b)adoptionInstance在智能合约调用之外声明变量,以便我们可以在最初检索它之后访问该实例。
    c)用call读取信息不用消耗gas。
    d)调用getAdopters(),adopters数组,检查是否为每只宠物存储了一个地址。
    e)一旦petId找到具有相应地址的地址,我们将禁用其采用按钮并将按钮文本更改为“成功”。
    f)将错误都会记录到控制台。
  4. 修改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. 区块链案例实践报告_1_DAPP宠物商店

    本文为个人学习报告,不做他用. 关于宠物商店的教程,网上已经给出了许多.因此,本文并不会十分详细地讲解具体操作,只是简述开发流程. 具体的实现步骤可参考 文字教程:https://www.jiansh ...

  2. 产业复苏|2020区块链与数字经济高峰论坛暨区块链战“疫”报告线上发布会召开...

    4月26日,产业复苏|2020区块链与数字经济高峰论坛暨区块链战"疫"报告线上发布会在北京隆重召开,本次大会通过线上形式举办. 本次大会在中国移动通信联合会区块链专委会.中国电子商 ...

  3. 陀螺财经携百家产业合作伙伴推出“史上最强产业区块链案例集”

    自去年12月陀螺财经宣布升级产业区块链服务,重磅上线"陀螺财经产业区块链平台"以来,我们已为超过200家区块链企业提供品牌信息发布.产业咨询.资源对接与技术解决方案一站式服务. 产 ...

  4. 【区块链】研究报告:2018年中国区块链行业应用报告

    近日,中国区块链基础服务联盟发布<2018年中国区块链行业应用报告>,报告总结了区块链技术的前世今生和发展历程,描述了全国300多家区块链企业的总体发展情况,并对区块链应用场景进行了深入的 ...

  5. 远望智库未来产业研究院与资本实验室联合发布《2021全球区块链应用市场报告》...

    来源:远望智库预见未来 从以比特币为代表的区块链1.0时代:到以智能合约为媒介,以金融应用为核心的区块链2.0时代:再到区块链应用于政务服务和更广泛的各行业,并开始推动信息互联网向价值互联网靠拢,短短 ...

  6. 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google

    近日,知名调研机构Gartner发布了全球领先公共云厂商区块链服务能力报告,作为唯一上榜的中国科技公司,阿里云获得六个评判维度的最高分,排名第二,仅次微软,领先AWS.Google等企业. Gartn ...

  7. 区块链成熟度评测报告

    区块链成熟度评测报告(1)--功能性对比 区块链成熟度评测报告(2)--性能效率.安全性对比 区块链成熟度评测报告(3)--可靠性.易用性.可扩展性对比 区块链成熟度评测报告(4)--可维护性.兼容性 ...

  8. 2020区块链产业投融资报告:揭秘资本视角下的区块链行业|陀螺研究院 x IT桔子

    区块链,是一种由多方共同维护,使用密码学保证传输和访问安全,能够实现数据一致存储.难以篡改.防止抵赖的分布式记账技术.2020年,在疫情的冲击中,区块链在非信环境下构建多方协同信任的能力倍受关注,慈善 ...

  9. 2020区块链产业投融资报告:揭秘资本视角下的区块链行业

    区块链,是一种由多方共同维护,使用密码学保证传输和访问安全,能够实现数据一致存储.难以篡改.防止抵赖的分布式记账技术.2020年,在疫情的冲击中,区块链在非信环境下构建多方协同信任的能力倍受关注,慈善 ...

最新文章

  1. pip在windows下安装配件/宏包
  2. Hive Lateral View、视图、索引
  3. FIFO跨时钟域读写
  4. boost::stacktrace模块实现终止处理程序的测试程序
  5. boost::contract模块实现命名覆盖的测试程序
  6. leetcode 54. Spiral Matrix | 54. 螺旋矩阵(Java)
  7. 数学--数论-- HDU6298 Maximum Multiple 打表找规律
  8. Ping, IPConfig, Format, Netstat, etc. Not Recognized as Commands
  9. 限制用户擅自更改ip的方法
  10. shutil模块 python_python之模块之shutil模块
  11. 途观l怎么使用_官宣!中型SUV质量最新排名出炉:汉兰达失前三,大众途观L上榜!...
  12. 剑指offer:剪绳子(找规律,贪心算法,动态规划)
  13. php foreach 为什么在if条件下多条数据只取出一条数据_微信大牛教你深入了解数据库索引...
  14. 一题多解 —— $?(命令返回状态)的检验
  15. mysql 分页拦截器_MyBatis 拦截器 (实现分页功能)
  16. 如何在 Mac 上使用“接力”回到上次离开的地方?
  17. 兆骑科创平台创新创业赛事路演,投融资服务
  18. 多数据源的配置,详细(新手,错误之处,请指正)
  19. 在整车OTA上,为啥新能源车企反而比传统车企做的更好?
  20. cout 声明与定义

热门文章

  1. git-新手入职必备操作流程
  2. python win32.com对excel的基本操作
  3. 从头开始学MySQL--------内连接、左连接、右连接(4)
  4. LeetCode-maximal-rectangle(最大矩阵面积)
  5. 仿微信图片缩放效果以及listview反弹效果
  6. Linux安全运维学习⑤ ---- yum工具进行软件的安装与卸载 (与依赖关系列表理解)
  7. new tech 201602
  8. To install it, you can run: npm install --save element-ui/lib/theme-chalk/index.css
  9. round在python是什么意思_python – round()和numpy.round()之间的底层差异是什么?
  10. 上班时间久了右肩膀总是疼怎么回事?