5,智能合约(react+区块链实战)
5,智能合约(react+区块链实战)
- 5-1 智能合约
- 5-2 metamask安装及私有链搭建互相联动
- 5-3 solidity数据类型-布尔-数字-地址(owner区别)
- 5-4 solidity 数组和映射(代币转账)
- 5-5 solidity结构体与枚举
5-1 智能合约
运行在区块链上的代码()
语言是类js的solidity
Js
尽量找js的语法类比
后期会讲如何部署合约到区块链
这先讲语法
强类型,变量必须声明类型
Constructor 初始化
左侧js,右侧智能合约
所有合约都有地址概念
可以使用官方remix进行编译看看
虚拟环境
Jsvm本地编译环境
Web3inject,链接远程的以太坊测试链或者私有链
编译及执行部署
具体可以参考
Metamask开发的不可缺少的插件
部署成功后函数已经可以出来
修改区块链也是需要gas
合约部署后,调用函数是需要支付gas
Complie部署区块链
一个给web3链接调用函数
5-2 metamask安装及私有链搭建互相联动
在remix中jsVM虚拟机瞬间部署调用
在真实开发里面不是连接jsVM虚拟机的,而是真正链接以太坊的链,无论私有链还是说公链,测试链
在部署合约时,要从metamask插件取钱部署
在谷歌装应用需要翻墙,而火狐浏览器可以直接安装
也可以添加插件文件
创建钱包,常用密码,助记词一定不要丢,备份自己的私钥(助记词,私钥映射到其中)
助记词可以通过算法算出秘钥
下一步安装一个私有链,就是使用
测试在本地搭建一个私有链,本地的以太坊可以随便用ganache
最后怎么部署到测试链,怎么部署到主链
主链花钱还是在私有链执行
其可以快速创建个人区块链,操作还可以显示在区块上
https://www.trufflesuite.com/ganache
下载windows,已经存到百度云盘
启动后如上
点击快速启动有一大堆东西
在7545端口给了10个账号,每个账号有100个以太币
上方是需要添加的网络,可以添加本地的网络
右上角可以添加账号
可以新增币种
账户详情有二维码和地址
打开ganache后无需管就有
刚打开全新的区块是0,创世区块
后面就是交易、合约(可以部署一般不会这样做)、事件、日志
需要记住networkid 是5777 ,127.0.0.1是本机
如何使用turffle框架链接本地私有链
现在已经启动7545的服务了
要使用metamask链接此私有链网络
下方添加的是一个火星币的网络
添加本地网络在metamask上
点击网络的自定义RPC
视频演示如下
自己添加的本地链如下
名称local-7545
Rpc-url http://127.0.0.1:7545
Id 1337
ZCH
复制一下本地的第2个秘钥
4aed45798c704e884968126ad6740de8631bcb2784e609466bd6260867732c8b
导入成功后如下,已经有100个币了
有了此后
在remix中选择 部署的环境 injectweb3
选择地址则是我们的账户地址,不是私钥,可以刷新得到
可以自动监听我们的钱包,本地账号
Gas选择少一些100等
可以点击部署,将合约部署到链上,这里还没有写合约
点击后并没有马上部署成功,弹出弹框需要支付gas
视频演示效果如下
本地演示效果如下
这里显示余额不足
是因为账户的原因,链接的是第一个无钱的账号,应该链接第二个导入的账户
如下
再次部署,如下
点击确认
此时账户余额变为99.99999
花费手续费部署了合约
Gas limit不用管即可
此次进入到下方
但我们修改内容就会弹出消耗gas的窗口
只要对合约中的数据进行了修改都需要支付手续费,只读的不需要支付gas
后面的领养宠物修改值的时候都会有弹窗
这里没有转账只有部署消耗gas
若是转账就是手续费加转账的钱
5-3 solidity数据类型-布尔-数字-地址(owner区别)
1,布尔值
True false && || !
2.整型
Unit 无符号整型,只能表示正数
Init 任何范围书都可表示
+ - * / uint) users; users["address1"] = 100; users["address2"] = 100; //所谓代币的转账就是映射里自己存储的值 users["address1"] -= 10; users["address2"] += 10;
pragma solidity ^0.4.24; //contract 关键词新建合约 contract Counter{ //变量必须声明类型 uint num; address owner; string name = "woniu"; uint [5] arr = [1,2,3,4,5]; arr[1] = 3; arr.push(6); for(unit i=0;i=arr.length;i++){ } //结构体(实现数字货币使用此做) mapping(address =>uint) users; users["address1"] = 100; users["address2"] = 100; //所谓代币的转账就是映射里自己存储的值 users["address1"] -= 10; users["address2"] += 10; //初始化 constructor(){ num = 0; //msg.sender 谁部署合约,这个值就是谁 owner = msg.sender; } //函数类型 public 公用函数(在执行此函数时,谁执行合约此msg.sender就是谁) function increment() public{ //只有最初的部署合约的人才能数字加一(要注意区分部署合约人的地址和执行合约人的地址的不同) if (owner == msg.sender){ num +=1; } } //view函数 只读取变量,不写 //声明返回值类型 function getNum() view returns (uint){ return num; } }
5-5 solidity结构体与枚举
6,结构体
结构体和map比较类似
struct Student{ uint age; uint id; string name; string phone; } //定义一个结构体(结构体中四个字段必须满足) woniu = Student(18,0,'woniu','13811111111') //数组中每个元素都可以是结构体
7,枚举
变量只能在此中选
//0,1(枚举里面的元素就是对应数字) enum sex {male,female} //male =0