区块链知识巩固
最近别人分享了一个网站,对于一些知识巩固我觉得挺好的
网站链接我就放在这里
学习这个网站,我就在这个博客上分享一些我的笔记
一,基本常识
1,Oracle: 就是充当区块链与外部世界联系的中介,允许智能合约与真实世界交互数据
2,Layer2: 它是构建在Laryer1之上的技术,它可以提高区块链交易的扩展性和效率,它通常在交易之外执行,就是为了避免交易拥挤和一些费用产生,如比特币闪电网络
3,DAPP:去中心化的应用,通常在区块链上运行,就类比我们现实生活中的app,就是应用
4,智能合约:它使自动执行的合约,在区块链上运行
5,web3: 它是一个未获许可依赖于去中心化的,也是一个术语,它开创了一个抗审查和透明协议和交易的一个领域
6,Chainlink: 它与区块链上的预言机,它通过链上的逻辑和链下的数据和计算,确保这个逻辑和这个数据保持去中心化
7,一个区块包括,区块头,区块体
区块头:nonce(交易的计数),前一个哈希值(注意:创世区块没有父哈希值)时间戳,三个树根(状态树根:记录所有账户的余额,信息等,交易树根,收据树根,币基(识别矿工的地址),难度目标(表示挖矿的难度)
区块体:包含了这个区块的所有交易哈希值
8,以以太坊为例:从上到下分为:区块链,区块,交易
交易:一个账户向另一个账户发送信息的行为,当发起交易时,以太坊客户端或者钱包会生成交易数据.交易数据包括:nonce(发送方的交易数量),gasPrice(发送方愿意支付的gas费用),gasLimit(发送方设置本次最大的gas费用),to(接收方的地址),value(要发送的钱),data(智能合约的字节码),v r s (交易的签名,又发送方的私钥产生)
9,软硬分叉:从字面上理解,就是一个妥协,一个强硬,区块链上的软硬分叉正是因为时代的更新,链上出现了分歧,那么如何解决呢,这是就出现了分叉,从项目上来说,一个项目的分叉(fork),分为一个子项目,那么开发人员就会分别进行这俩个项目,但是区块链上,就不同,就出现了俩种概念
- 软分叉:向前兼容,旧版本接受新版本的东西,但是在旧版本的算力要大于51%,才能产生软分叉,最后链比较长的保留
- 硬分叉:不兼容,旧版本和新版本是完全分开的,它不需要算力大于51%(因为即使旧版本的链长于新版本,但是也不影响新版本,因为新版本不会接受旧版本的东西,而旧版本夜也不会接受新版本的东西),直接产生硬分叉
二,solidity的知识查漏补缺
1,我感觉学了Java的话会很好理解。
2,使用结构体时,采用实例化对象,如果对象很多,就采用动态数组,这样就比较方便
eg,定义一个名Person的结构体,用Person[] list_of_people ,那么list_of_people数组就可以储存多个Person对象
3,注意到了一个智能问答小助手,名为phind,就是可以用它来检查你的合约是否缺逗号问题啥的
4,数据储存:calldata,它是只能读,不能调用使用。但是在合约中内存memory可以允许读写,让变量改变在函数中,为了修改calldata我们必须先将它储存到内存memory中。calldata和memory,都是临时储存变量。Storage储存变量,它是持久的储存在区块链上,被外部调用时会保留它们的值,任何在函数外部声明的变量都会隐式的转化储存变量,但是不能在函数中定义使用Storage,只能使用calldata和memory。
5,映射,在前面我们也了解到,用动态数组储存Person对象,但是如果有很多对象,而我们要找其中一个,就必须从头历遍,这样就会佷麻烦,所以就出现了映射,构造一个映射对象,将一个变量和另一个变量联系起来,提供噶我们的查找效率
6,合约实例部署,使用new关键字,类似于java的理解。首先你将要部署的合约A和我们的工厂合约B放在一起,然后在工厂合约B中用A定义a,再定义一个函数create,里面写a=new A();这样一个合约实例就部署出来了,没使用create的时候,可以看见a的地址为0,使用后就可以发现a就有地址了,也可以说是,我们把合约A部署出来了,还有一种简单的方法,采用import关键字,这样就可以不用把合约A和合约B写在一起了,直接就是improt”./A”
import的使用方法:如果要导入的合约只包含一个合约,就可以直接使用 import”./“,如果是要导入的合约中包括很多种合约,然后你要使用哪种合约,就在{}里写,在” “写来源,就是大合约,import {A,B} from “./A”;
7,继承于重写:俩个关键字 override,virtual,例如A is B{};A合约继承B合约,我们要修改A中继承B合约的函数,那么,我们就要在A合约中要修改的函数加上override关键字,在B合约被修改的函数中加上vritual关键字,这样就不会报错
8,一个可以计算,wei,Gwei,Ether,之间的转化的工具:Converter;
9,gas:交易所产生的手术费,如果一个交易被revert了,那么它的gas就不会返回,为了解决这个问题,以太坊就有一个功能,自己设置能承担的最大gas费用
10,库:真的是查漏补缺了,这个库,我还是第一次了解到,库就是为了简化智能合约,使用Library关键字,定义一个Math的库,Library Math{};里面就放函数,在其他合约中可以直接使用库.函数名,直接进行调用,或者使用use for ,例如要在合约中uint类型的变量可以使用Math库,就直接use Math for uint;这样合约中的uint类型的变量就可以使用Math库中的函数,uint类型.函数名,(注意的先使用import导入库)
11,注意合约的solidity的版本,在0.6版本时,没有对溢出的一个检查,但是使用SafeMath.sol可以对它进行检查。在solidity版本0.8以上时,它有检查上溢和下溢的功能,所以就不需要使用SafeMath.sol
12,重置阵列:使用new关键字,即将每个元素都重置为零,例如:fouder = new address;还有一种delete.直接删除变量的值
13,modifier:修饰器,如果合约较长,而我们又必须每个检查合约的所有者,使用require的话会很繁杂,所以就有修饰器了,例如:
modifier onlyOwner{ |
注意这里有个_,如果函数使用了onlyOwner的修饰符,那么就会先执行_以前的代码,如果成功,再执行函数中的代码
14,自定义错误:从solidity的0.8.4开始,引入了自定义的错误,用于节省Gas并提高更加具体的错误信息,revert用于手动触发异常,例如
function withdraw (uint amount ){ |
而自定义错误,用于提供更详细和节省Gas的错误信息,例如:error InsufficientBalance(uint requested,uint available);使用的时候用revert即可:revert InsufficientBalance(requested:amount,available:balance);
15,receive(): 适用于合约中有它,且没有msg.data的存在,而fallback()就是相反
16,一些有用的小助手
ChatGPT;
谷歌开发的一个智能软件:Gemini;
一个社区的检索问题:Ethereum-Stack-Exchange
一个社区的全球交流平台:stackoverflow;
web一个知识构建平台:Peerhana;