区块链
Solidity 标签描述

在Solidity语言中,pure关键字用于修饰函数或方法,表示该函数或方法不修改合约的状态变量,也不执行任何状态更改操作。 被pure修饰的函数或方法只读取输入参数并返回结果,不会对合约的状态产生任何影响。这意味着,如果一个函数被声明为pure,那么该函数不能修改合约的存储,不能调用其他的非pure函数,也不能执行其他的状态更改操作,如发送以太币或调用其他的合约。 pure关键字可以用于提高函数或方法的效率和安全性。由于不执行任何状态更改操作,pure函数或方法可以在不需要访问区块链的情况下进行计算和验证,从而提高了效率。此外,由于不依赖于合约的状态,pure函数或方法也更加安全,因为它们不...

  iwbGD3gmtxyT   2023年11月02日   56   0   0 Soliditypure区块链

调用已部署合约 开发者写智能合约来调用其他合约,这让Ethereum网络上的程序可以复用,从而建立繁荣的生态。很多web3项目依赖于调用其他合约,比如收益农场(yieldfarming)。这一讲,我们介绍如何在已知合约代码(或接口)和地址情况下调用目标合约的函数。 目标合约 我们先写一个简单的合约OtherContract来调用。 contractOtherContract{uint256private_x=0;//状态变量_x//收到eth的事件,记录amount和gaseventLog(uintamount,uintgas);//返回合约ETH余额functiongetBalance...

(1)同其他高级语言类似,Solidity语言中也有this关键字。但是,在构造函数中调用this会出现问题,原因是因为在构造函数中,this的对象尚未生成所致。 注意,上图中,this关键字下添加了波浪线,指出: (2)自0.4.22颁布起,废除function+合约名称来定义构造函数,而采用“constructor(...){...}”来声明构造函数。 以前版本中是这样定义构造函数的: contractTestCon{   functionTestConpublic{     //......   } } 自0.4.22颁布起,新的构造函数定义使用constructor关键字,如...

  iwbGD3gmtxyT   2023年11月02日   65   0   0 Solidity构造函数this关键字

​​MerkleTree​​​,也叫默克尔树或哈希树,是区块链的底层加密技术,被BTC和Ethereum区块链广泛采用。​​MerkleTree​​​是一种自下而上构建的加密树,每个叶子是对应数据的哈希,而每个非叶子为它的​​2​​个子节点的哈希。 ​​MerkleTree​​允许对大型数据结构的内容进行有效和安全的验证(​​MerkleProof​​)。对于有​​N​​个叶子结点的​​MerkleTree​​,在已知​​root​​根值的情况下,验证某个数据是否有效(属于​​MerkleTree​​叶子结点)只需要​​log(N)​​个数据(也叫​​proof​​),非常高效。如果数据有误...

ABI(ApplicationBinaryInterface,应用二进制接口)是与Ethereum智能合约交互的标准。数据基于他们的类型编码;并且由于编码后不包含类型信息,解码时需要注明它们的类型。 Solidity中,ABI编码有4个函数:​​abi.encode​​,​​abi.encodePacked​​,soli,​​abi.encodeWithSelector​​。而ABI解码有1个函数:​​abi.decode​​,用于解码abi.encode的数据。这一讲,我们将学习如何使用这些函数。 ABI编码 我们将用编码4个变量,他们的类型分别是uint256,address,string...

在Ethereum链上,用户(外部账户,EOA)可以创建智能合约,智能合约同样也可以创建新的智能合约。去中心化交易所uniswap就是利用工厂合约(Factory)创建了无数个币对合约(Pair)。这一讲,我会用简化版的uniswap讲如何通过合约创建合约。 create和create2 有两种方法可以在合约中创建新合约,create和create2,这里我们讲create,下一讲会介绍create2。 create的用法很简单,就是new一个合约,并传入新合约构造函数所需的参数: Contractx=newContract{value:_value}(params) 其中Cont...

try-catch是现代编程语言几乎都有的处理异常的一种标准方式,solidity0.6版本也添加了它。这一讲,我们将介绍如何利用try-catch处理智能合约中的异常。 try-catch 在solidity中,try-catch只能被用于external函数或创建合约时constructor(被视为external函数)的调用。基本语法如下: tryexternalContract.f(){//call成功的情况下运行一些代码}catch{//call失败的情况下运行一些代码} 其中externalContract.f()是某个外部合约的函数调用,try模块在调用成功的情况下运...

delegatecall delegatecall与call类似,是solidity中地址类型的低级成员函数。delegate中是委托/代表的意思,那么delegatecall委托了什么? 当用户A通过合约B来call合约C的时候,执行的是合约C的函数,语境(Context,可以理解为包含变量和状态的环境)也是合约C的:​​msg.sender​​是B的地址,并且如果函数改变一些状态变量,产生的效果会作用于合约C的变量上。 而当用户A通过合约B来delegatecall合约C的时候,执行的是合约C的函数,但是语境仍是合约B的:msg.sender是A的地址,并且如果函数改变一些状态变量,产生...

我们曾在第20讲:发送ETH那一讲介绍过利用call来发送ETH,这一讲我们将介绍如何利用它调用合约。 Call call是address类型的低级成员函数,它用来与其他合约交互。它的返回值为(bool,data),分别对应call是否成功以及目标函数的返回值。 call是solidity官方推荐的通过触发fallback或receive函数发送ETH的方法。 不推荐用call来调用另一个合约,因为当你调用不安全合约的函数时,你就把主动权交给了它。推荐的方法仍是声明合约变量后调用函数,见第21讲:调用其他合约 当我们不知道对方合约的源代码或ABI,就没法生成合约变量;这时,我们仍可以通过ca...

selector 当我们调用智能合约时,本质上是向目标合约发送了一段calldata,在remix中发送一次交易后,可以在详细信息中看见input即为此次交易的calldata 发送的calldata中前4个字节是selector(函数选择器)。这一讲,我们将介绍selector是什么,以及如何使用。 msg.data msg.data是solidity中的一个全局变量,值为完整的calldata(调用函数时传入的数据)。 在下面的代码中,我们可以通过Log事件来输出调用mint函数的calldata: //event返回msg.dataeventLog(bytesdata);func...