千家信息网

Solidity地址类型有哪些

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"Solidity地址类型有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Solidity地址类型有哪些"吧!地址类型(Address
千家信息网最后更新 2026年11月01日Solidity地址类型有哪些

本篇内容主要讲解"Solidity地址类型有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Solidity地址类型有哪些"吧!

地址类型(Address)

地址类型address是一个值类型,

地址: 20字节(一个以太坊地址的长度),地址类型也有成员,地址是所有合约的基础 支持的运算符:

  • <=, <, ==, !=, >= 和 >

注意:从0.5.0开始,合约不再继承自地址类型,但仍然可以显式转换为地址。

地址类型的成员

  • balance 属性及transfer() 函数 这里是地址类型相关成员的快速索引 balance用来查询账户余额,transfer()用来发送以太币(以wei为单位)。 如:

    address x = 0x123;address myAddress = this;if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);


    注解:如果x是合约地址,合约的回退函数(fallback 函数)会随transfer调用一起执行(这个是EVM特性),如果因gas耗光或其他原因失败,转移交易会还原并且合约会抛异常停止。

    关于回退函数(fallback 函数),简单来说它是合约中无函数名函数,下面代码事例中,进进一步讲解回退函数(fallback) 的使用。

  • send() 函数 send 与transfer对应,但更底层。如果执行失败,transfer不会因异常停止,而send会返回false。

    警告:send() 执行有一些风险:如果调用栈的深度超过1024或gas耗光,交易都会失败。因此,为了保证安全,必须检查send的返回值,如果交易失败,会回退以太币。如果用transfer会更好。

  • call(), callcode() 和 delegatecall() 函数 为了和非ABI协议的合约进行交互,可以使用call() 函数, 它用来向另一个合约发送原始数据,支持任何类型任意数量的参数,每个参数会按规则(ABI协议)打包成32字节并一一拼接到一起。一个例外是:如果第一个参数恰好4个字节,在这种情况下,会被认为根据ABI协议定义的函数器指定的函数签名而直接使用。如果仅想发送消息体,需要避免第一个参数是4个字节。如下面的例子:

    address nameReg = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;nameReg.call("register", "MyName");nameReg.call(bytes4(keccak256("fun(uint256)")), a);


    call函数返回一个bool值,以表明执行成功与否。正常结束返回true,异常终止返回false。但无法获取到结果数据,因为需要提前知道返回的数据的编码和数据大小(因不知道对方使用的协议格式,所以也不会知道返回的结果如何解析)。 还可以提供**.gas()**修饰器进行调用:

    namReg.call.gas(1000000)("register", "MyName");


    类似还可以提供附带以太币:

    nameReg.call.value(1 ether)("register", "MyName");


    修饰器可以混合使用,修饰器调用顺序无所谓。

    nameReg.call.gas(1000000).value(1 ether)("register", "MyName");

    注解:目前还不能在重载函数上使用gas或value修饰符,A workaround is to introduce a special case for gas and value and just re-check whether they are present at the point of overload resolution.(这句我怕翻译的不准确,引用原文)

    同样我们也可以使用delegatecall(),它与call方法的区别在于,仅仅是代码会执行,而其它方面,如(存储,余额等)都是用的当前的合约的数据。delegatecall()方法的目的是用来执行另一个合约中的库代码。所以开发者需要保证两个合约中的存储变量能兼容,来保证delegatecall()能顺利执行。在homestead阶段之前,仅有一个受限的callcode()方法可用,但callcode未提供对msg.sender,msg.value的访问权限。

    上面的这三个方法call(),delegatecall(),callcode()都是底层的消息传递调用,最好仅在万不得已才进行使用,因为他们破坏了Solidity的类型安全。 .gas() 在call(), callcode() 和 delegatecall() 函数下都可以使用, delegatecall()不支持.value()

    注解:所有合约都继承了address的成员,因此可以使用this.balance查询余额。 callcode不鼓励使用,以后会移除。

    警告:上述的函数都是底层的函数,使用时要异常小心。当调用一个未知的,可能是恶意的合约时,当你把控制权交给它,它可能回调回你的合约,所以要准备好在调用返回时,应对你的状态变量可能被恶意篡改的情况。

地址常量(Address Literals)

一个能通过地址合法性检查(address checksum test)十六进制常量就会被认为是地址,如0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF。而不能通过地址合法性检查的39到41位长的十六进制常量,会提示一个警告,被视为普通的有理数常量。

地址合法性检查定义在EIP-55

合约事例讲解

合约事例代码

pragma solidity ^0.4.0;contract AddrTest{    event logdata(bytes data);    function() payable {        logdata(msg.data);    }        function getBalance() returns (uint) {        return this.balance;    }    uint score = 0;    function setScore(uint s) public {        score = s;    }        function getScore() returns ( uint){        return score;    }}contract CallTest{    function deposit() payable {    }        event logSendEvent(address to, uint value);    function transferEther(address towho) payable {        towho.transfer(10);        logSendEvent(towho, 10);    }        function callNoFunc(address addr) returns (bool){        return addr.call("tinyxiong", 1234);    }      function callfunc(address addr) returns (bool){        bytes4 methodId = bytes4(keccak256("setScore(uint256)"));        return addr.call(methodId, 100);    }          function getBalance() returns (uint) {        return this.balance;    }  }

到此,相信大家对"Solidity地址类型有哪些"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

地址 函数 合约 类型 数据 方法 代码 参数 字节 常量 以太 检查 合法 事例 余额 合法性 底层 成员 注解 交易 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 易互联网科技有限公司 科技服务与互联网 有马互联网科技 镁科技互联网资讯平台 成都仁贤领冠互联网科技有限公司 哈尔滨秒房互联网科技有限公司 深圳市运趣互联网科技有限公司 云创客互联网科技公司 福州新华互联网科技学校 知乎 互联网科技项目计划书材料类 浙南科技城互联网大厦建设工程 互联网时代的科技公司 银行科技岗属于互联网吗 神州科技互联网有限公司 唯美互联网科技 互联网科技的前景 互联网的科技体现在哪里 伍佰万互联网科技是干嘛的 颐高云石互联网科技 小牛互联网科技有限公司地址 手冲咖啡和咖啡机区别 互联网科技企业 互联网的科技 与互联网科技公司 互联网企业和科技型企业 科技互联网大厂 花神(南京)互联网科技有限公司 乌鲁木齐新华智原互联网科技学校 版纳互联网科技选哪家 小牛互联网科技有限公司地址
0