solidity(智能合约)零基础教学(4)

前言:

在现实生活中,当我们把智能协议上传以太坊后,他就变成了一个不可更改的代码了,这永固性意味着我们的代码永远不可能被调整或者更新。我们编译的程序会一直,永久的,不可篡改的存在以太坊上。这也是我们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;
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值