让建站和SEO变得简单

让不懂建站的用户快速建站,让会建站的提高建站效率!

  • 技能素养 | Solidity编程说话:Address | BTC

    发布日期:2022-08-21 15:43    点击次数:98

    地址 这边要说的地址并不是粗糙的编程说话中的内存地址,而是买卖业务地址。俺们明了区块链进动价值传递的期间必须是经由流程一个地址传递到另一个地址,无论买卖业务简略相符约齐离不开地址。因此把地址作Address为Solidity说话的内嵌数据类型会极度简便修复的,更艰苦的一丝即是在Solidity中,一起相符约齐给与地址Address类型。这不只仅是单纯的为了在语法上的结束,而在实质情况是相符约我方就离不开地址,包括相符约的甩掉和奉行齐必要隘址的参与。 地址是两栽类型,一栽是address,一栽是address payable。其中address payable比较address类型众了两个成员手法send和transfer,外示没关系向address payable类型的变量进动转帐操作。

    地址类型措施苦求

    以太坊中的地址是20个字节,比如0x52908400098527886E0F7030069857D2E4169EE7,由于一个字节等于8位,是以地址也没关系答用uint160来声明。地址粗糙没关系进动比较运算。

    pragma solidity >=0.4.0 <0.6.0;

    contract EgAddress{

    function testType() public { address _addr = 0x52908400098527886E0F7030069857D2E4169EE7; uint160 _addi = 471360049350540642640628028220064440840608208820; string memory h = hex"52908400098527886E0F7030069857D2E4169EE7"; address addr = address(_addi); //addr = address(h); uint160 addi = uint160(_addr);

    }

    }

      镇静的是hex类型是不克径直和address进动调度的。 address诚然是十六进制串,address是有措施苦求的,西席手法是可参考EIP55 相符约地址,俺们明了每个相符约齐是径过一个帐户甩掉到区块连上的,同期这个相符约也会生成一个地址,并没关系向这个相符约地址进动转帐操作。那么这个甩掉的帐户地址和相符约地址是如何得到呢。  

    pragma solidity >=0.4.0 <0.6.0;

    contract EgAddress{ address public owner;

    constructor() public { owner = msg.sender; }

    function getOwner() public returns(address){ return owner; }

    function getContractAddr() public view returns(address){ return address(this); }

    function getSenderAddr() public returns (address){ return msg.sender; } } msg.sender是内置手法,他复返面前目今手法的调用者地址,也即是说俺经由流程A帐户调用相符约手法getSenderAddr,则复返的是A的地址,经由流程B帐户调用相符约手法getSenderAddr,则复返的是B的地址。(另外还有msg.value和msg.data齐经由流程调用者传进来的数据) 结构函数constructor是在相符约进动甩掉时奉行,且只奉行一次。 在取得相符约的创建者则是经由流程“弯线”的形势取得,开首声明景色变量owner,接着在结构函数中将手法的调用者的地址赋值给owner,由于结构函数独一在相符约创建时才会被调用,是以owner保存的即是相符约创建者的地址,效果经由流程公有手法getOwner将景色变量的值复返出往。 在取得相符约我方的地址是经由流程this来取得,国产精品哔哩哔哩旧的版块不妨this我方即是address类型的,没关系径直复返this,但本示例中的版块必要将this是EgAddress类型的,必要作念个类型调度才能复返address类型。 员变量balance 每个地址齐代外着一个价值的抓有者,是以没关系径直查望其余额,即经由流程balance属性 成员手法 除了成员变量balance外,还有以下几个成员手法。 成员手法| | – | | <address>.balance (uint256) | | <address payable>.transfer(uint256 amount) | | <address payable>.send(uint256 amount) returns (bool) | | <address>.call(bytes memory) returns (bool, bytes memory) | | <address>.delegatecall(bytes memory) returns (bool, bytes memory) | | <address>.staticcall(bytes memory) returns (bool, bytes memory) |

    例子:

    pragma solidity >=0.4.0 <0.6.0;

    contract EgAddress{

    function testSend()payable public { address payable to = 0x52908400098527886E0F7030069857D2E4169EE7; to.send(msg.value); }

    function testTranser()payable public { address payable to = 0x52908400098527886E0F7030069857D2E4169EE7; to.transfer(msg.value); }

    function testStack1024(uint depth) payable public{ address payable to = 0x52908400098527886E0F7030069857D2E4169EE7; bool r = to.send(1 wei); if (depth >1 && r){ testStack1024(depth -1); } }

    /*function testCSend() payable public { address payable to = address(this); this.send(msg.value); address(this).send(msg.value); }*/

    /*function testCTranser()payable public { // address payable to = 0x52908400098527886E0F7030069857D2E4169EE7; address(this).transfer(msg.value); }*/ }

     

    手法: send send手法比较较transfer手法来说更“底层”一些,倘若send手法奉行溃败,并不会抛出失常,而是复返false。 send调用栈深度不克卓越1024,不然会奉行溃败。这个题目在testStack1024手法中进动了考据,不传说入的数字太大的话,会奉行溃败,即使没到1024,因为还没找到。 send手法会复返bool类型的培育来外示奉行培育。 倘若gas不敷会奉行溃败。 提出答用transfer手法,相对更安宁些。 transfer transfer和send答用手法上相像,亦然用来进动转帐操作,倘若面前目今帐户余额不及简略对方帐户拒却转帐,则会奉行溃败。 倘若transfer的调用地址是一个相符约地址,则相符约的回调函数将被奉行。 关call及delegatecall、staticcall单独答用一篇幅来讲。  

    作者:感谢HPB 蓝莲花团队清算供稿。

    注:如有题目请鄙人方留言关系俺们技能社群。

    汪晓明博客:http://wangxiaoming.com/

    汪晓明:HPB芯链创起东谈主,BTC专栏作者。十余年金融大数据、区块链技能修复训戒,曾参与创建银联大数据。主创区块链素养视频节现在《明说》30众期,编写了《以太坊官网文档华文版》4399日本电影免费观看,并行为要紧作者编写了《区块链修复指南》,在中国区块链社区以ID“蓝莲花”驰名。




Powered by 两个人看的片免费HD完整 @2013-2022 RSS地图 HTML地图