前言:
在现实生活中,当我们把智能协议上传以太坊后,他就变成了一个不可更改的代码了,这永固性意味着我们的代码永远不可能被调整或者更新。我们编译的程序会一直,永久的,不可篡改的存在以太坊上。这也是我们solidity代码的安全性如此重要的一个原因。假如我们的智能合约存在漏洞,及时我们发现了也无法补救。我们只能放弃中国智能合约,然后转移到一个新的修复台的合约上。同时这也是智能合约的一大优势。代码说明一切。如果去读取智能合约的代码,并验证它,我们会发现,一旦函数被定义下来,每一次执行,程序都会按照原有的代码逻辑一丝不苟的执行,完全不用担心函数被别人篡改而得到意外的结果。
在以太坊这样的公有区块链网络上,所有交易都需要消耗一定的资源,这些资源被称为“gas”。这是因为以太坊网络是由许多不同的节点共同维护的,每个节点都需要消耗计算能力和存储空间来处理和验证交易。为了激励节点参与网络维护工作,以太坊采用了 gas 费用制度,即每当有人发起一笔交易,他们必须支付一定的 gas 费用,这些费用最终会分配给那些参与交易处理的节点。 对于读取区块链上的数据,同样也需要消耗 gas,因为这涉及到从网络中查找并检索数据的过程,而这同样需要消耗节点的计算能力和存储空间。此外,为了防止恶意攻击者滥用网络资源,以太坊还引入了 gas 调整机制,即每笔交易所消耗的 gas 数量会根据网络拥堵程度动态调整,这样就可以更好地平衡网络的负载和效率。 总之,通过收取 gas 费用,以太坊网络能够有效地激励节点参与网络维护工作,同时还可以防止恶意攻击者滥用网络资源,从而保证整个系统的稳定性和安全性。
分享一些减少gas消耗的小技巧
方法一:遇到以后都不会变的数据,不需要更改的数据都可以用constant修饰
//方法一
//不加constant合约一共消耗了117915gas
//加constant合约一共消耗了77126gas,可以看到省了非常多的gas
string constant call = "hello world";
方法二:遇到那种一个合约只用一次的数据,我们可以用immutable
//方法二
//不加constant合约一共消耗了103767gas
//加constant合约一共消耗了78273gas,也是省了很多gas
//及时我们后续查看Myaddress这个数据也能省不少gas
address immutable Myaddress ;
// 构造方法,每个合约部署的时候执行一次。后续不会再执行了。
constructor(){
Myaddress = msg.sender;
}
方法三:多用在solidity 0.8.4以后的版本出现的error方法
// 方法三
//直接用require会消耗158216gas
//用if配套error会消耗132388gas
error NotOwner();
function Fund() public view returns(address){
// require(msg.sender != Myaddress);
if(msg.sender != Myaddress){
revert NotOwner();
}
return msg.sender;
}
方法四: 我们平时设置一些公共数据的时候会把一些数设成public
//方法四
//直接调用数据合约中总共消耗203195gas
//通过调用方法获得num的值消耗了202450gas
uint public num1 = 520;
uint num2 = 521;
function getnum() public view returns(uint) {
return num2;
}
方法五: 尽量用uint256(默认的),也可以减少gas的消耗
// 方法五
// 消耗了266123 gas
// uint aa = 100;
//消耗了gas 266589gas
uint8 bb = 100;
方法六: 多个数据用结构体连起来也能减少gas的消耗,将多个数据打包成一个数据中都是可以减少gas消耗的
//方法六
// 使用结构体消耗了292103 gas
struct Data {
uint64 a;
uint64 b;
uint128 c;
uint256 d;
}
// 不适用结构体消耗的gas是297089gas
uint64 a;
uint64 b;
uint128 c;
uint256 d;
}
总结:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8;
contract Text{
//方法一
//遇到以后都不会变的数据,不需要更改的数据都可以用constant修饰
//不加constant合约一共消耗了117915gas
//加constant合约一共消耗了77126gas,可以看到省了非常多的gas
// string constant call = "hello world";
//方法二
//遇到那种一个合约只用一次的数据,我们可以用immutable
//不加constant合约一共消耗了103767gas
//加constant合约一共消耗了78273gas,也是省了很多gas
//及时我们后续查看Myaddress这个数据也能省不少gas
address immutable Myaddress ;
// 构造方法,每个合约部署的时候执行一次。后续不会再执行了。
constructor(){
Myaddress = msg.sender;
}
// 方法三
//多用在solidity 0.8.4以后的版本出现了error方法
//直接用require会消耗158216gas
//用if配套error会消耗132388gas
error NotOwner();
function Fund() public view returns(address){
// require(msg.sender != Myaddress);
if(msg.sender != Myaddress){
revert NotOwner();
}
return msg.sender;
}
//方法四
//我们平时设置一些公共数据的时候会把一些数设成public
//直接调用数据合约中总共消耗203195gas
//通过调用方法获得num的值消耗了202450gas
uint public num1 = 520;
uint num2 = 521;
function getnum() public view returns(uint) {
return num2;
}
// 方法五
// 尽量用uint256,也可以减少gas的消耗
// 消耗了266123 gas
// uint aa = 100;
//消耗了gas 266589gas
uint8 bb = 100;
//方法六
// 多个数据用结构体连起来也能减少gas的消耗,将多个数据打包成一个数据中都是可以减少gas消耗的
// 使用结构体消耗了292103 gas
struct Data {
uint64 a;
uint64 b;
uint128 c;
uint256 d;
}
// 不适用结构体消耗的gas是297089gas
uint64 a;
uint64 b;
uint128 c;
uint256 d;
}