地址Address

以太坊钱包地址位数验证

以太坊中的地址的长度为20字节一字节等于8位,一共160位,所以address其实亦可以用uint160来声明。

我的以太坊钱包地址为0xDF12793CA392ff748adF013D146f8dA73df6E3040x代表十六进制,我们将DF12793CA392ff748adF013D146f8dA73df6E304拷贝,如下图所示,将其进行二进制转换,不难发现,它的二进制刚好160位

备注:以太坊钱包地址是以16进制的形式呈现,我们知道一个十六进制的数字等于4个字节,160 / 4 = 40,你自己验证一下,钱包地址DF12793CA392ff748adF013D146f8dA73df6E304的长度为40

以太坊钱包地址

0xDF12793CA392ff748adF013D146f8dA73df6E304

通过工具对应的二进制为:

1101111100010010011110010011110010100011100100110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

ps:通过工具转换的二进制可能存在问题,可以自己尝试转换。

pragma solidity ^0.4.4;contract  test {address _owner;uint160 _ownerUint;function test() {_owner = 0xDF12793CA392ff748adF013D146f8dA73df6E304;_ownerUint = 1273516916528256943268872459582090959717186069252;}function owner() constant returns (address) {return _owner;}function ownerUint160() constant returns(uint160){ //转换10进制 1273516916528256943268872459582090959717186069252return uint160(_owner);}function ownerUintToAddress() constant returns (address) {return address(_ownerUint);}
}//0x 16进制 45
//B 2进制 0100 0101//1 + 2 + 4 + 8 + 16 + 32 + 64 + 128
//1 + 0 + 4 + 0 + 0  + 0 + 64 + 0 = 69
//D 10进制 69 //0x DF12793CA392ff748adF013D146f8dA73df6E304
//D 转换10进制 1273516916528256943268872459582090959717186069252//1 2 3 4 5 6 7 8 9 A B C D E F
//40个 * 4位(二进制) =160位
//1101        1111           0001 0010 0111 10010011110010100011100100110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
//1+4+8=13 D  1+2+4+8=15 F   1    2    1+2+4=7 ....
//address
//uint160

不可不知的几个常识

  • 合约拥有者

msg.sender就是当前调用方法时的发起人,一个合约部署后,通过钱包地址操作合约的人很多,但是如何正确判断谁是合约的拥有者,判断方式很简单,就是第一次部署合约时,谁出的gas,谁就对合约具有拥有权

pragma solidity ^0.4.4;contract Test {address public _owner;uint public _number;function Test() {_owner = msg.sender;_number = 100;}function msgSenderAddress() constant returns (address) {return msg.sender;}function setNumberAdd1() {_number = _number + 5;}function setNumberAdd2() {if (_owner == msg.sender) {_number = _number + 10;}}
}//0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C
  • 合约地址
pragma solidity ^0.4.4;// 0x903ad08970c70d10e5fb5b3c26f7b714830afcf6
// 0x62e40877f4747e06197aa1a2b9ac06dd9bb244a3// 0xf055775ebd516e7419ae486c1d50c682d4170645// 0xe7795e05d15f7406baf411cafe766fc28eccf35f
// 0xe7795e05d15f7406baf411cafe766fc28eccf35fcontract Test {address public _owner;uint public _number;function Test() {_owner = msg.sender;_number = 100;}function msgSenderAddress() constant returns (address) {return msg.sender;}function setNumberAdd1() {_number = _number + 5;}function setNumberAdd2() {if (_owner == msg.sender) {_number = _number + 10;}}function returnContractAddress() constant returns (address) {return this;}}

一个合约部署后,会有一个合约地址,这个合约地址就代表合约自己。
this在合约中到底是msg.sender还是合约地址,由上图不难看出,this即是当前合约地址

部署

在Remix网页编辑器中点击部署(Deploy)按钮

点击插件的submit

显示部署挖矿成功,钱包中的测试以太币也相应的减去部署需要花费的gas

支持的运算符

pragma solidity ^0.4.4;contract Test {address address1;address address2;// <=,<,==,!=,>=和>function Test() {address1 = 0xF055775eBD516e7419ae486C1d50C682d4170645;address2 = 0xEAEC9B481c60e8cDc3cdF2D342082C349E5D6318;}// <=function test1() constant returns (bool) {return address1 <= address2;}// <function test2() constant returns (bool) {return address1 < address2;}//  != function test3() constant returns (bool) {return address1 != address2;}// >=function test4() constant returns (bool) {return address1 >= address2;}// >function test5() constant returns (bool) {return address1 > address2;}
}

  • <=<==!=>=>

成员变量和函数

  • 一、 balance

    如果我们需要查看一个地址的余额,我们可以使用balance属性进行查看。

pragma solidity ^0.4.4;contract addressBalance{function getBalance(address addr) constant returns (uint){return addr.balance;}}

Account一栏中,会自动生成测试钱包地址供我们测试使用,在我们点击Deploy按钮时,Account一栏选中的是钱包地址,我们部署合约时,花费的gas就从这个钱包地址里面扣除,【PS:这5个钱包地址每次都是系统临时生成,所以在我们开发测试过程中,每次的地址不会相同】。因为在本案例中,我们部署合约时,用的是第一个Account,所以gas自然从它里面扣除,大家会发现,其它四个钱包地址中的余额是ether,而第一个钱包地址中不到100个ether

当我们点击getBalance获取某个钱包地址的余额时,获取到的余额的单位是Wei,一个ether等于1000000000000000000WeiWei是最小单位,相当于我们的1元RMB等于100分。【PS:1ether等于10的18次方Wei】

99999999999996890347 wei == 99.999999999996890347 ether
  • 二、this 查看当前合约地址余额
pragma solidity ^0.4.4;contract addressBalance{function getBalance() constant returns (uint){return this.balance;}function getContractAddrees() constant returns (address){return this;}function getBalance(address addr) constant returns (uint){return addr.balance;}}

  • 三、transfer

transfer:从合约发起方向某个地址转入以太币(单位是wei),地址无效或者合约发起方余额不足时,代码将抛出异常并停止转账。

pragma solidity ^0.4.4;contract PayableKeyword{ // 从合约发起方向 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址转入 msg.value 个以太币,单位是 weifunction deposit() payable{address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;Account2.transfer(msg.value);}// 读取 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址的余额function getAccount2Balance() constant returns (uint) {address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;return Account2.balance;}  // 读取合约发起方的余额function getOwnerBalance() constant returns (uint) {address Owner = msg.sender;return Owner.balance;} }

  • 四、send

send:send相对transfer方法较底层,不过使用方法和transfer相同,都是从合约发起方向某个地址转入以太币(单位是wei),地址无效或者合约发起方余额不足时,send不会抛出异常,而是直接返回false。

pragma solidity ^0.4.4;contract PayableKeyword{ function deposit() payable returns (bool){address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;return Account2.send(msg.value);}function getAccount2Balance() constant returns (uint) {address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;return Account2.balance;}  function getOwnerBalance() constant returns (uint) {address Owner = msg.sender;return Owner.balance;}

⚠️Warning

send()方法执行时有一些风险

  • 调用递归深度不能超1024。
  • 如果gas不够,执行会失败。
  • 所以使用这个方法要检查成功与否。
  • transfer相对send较安全

区块链:Solidity值类型(地址Address)相关推荐

  1. 区块链solidity学习(地址、交易篇:一)

    (1)下图为remix中有关地址交易的代码展示: 只要与交易相关的function函数,则需要加上 payable 标识,否则会导致不能进行交易: 外部两个不同的账户进行转账时,使用 transfer ...

  2. 基于Java语言构建区块链(五)—— 地址(钱包)

    基于Java语言构建区块链(五)-- 地址(钱包) 2018年03月25日 18:02:06 wangwei_hz 阅读数:1292更多 个人分类: 区块链bitcoin比特币 文章的主要思想和内容均 ...

  3. golang重写区块链——0.5 区块链中钱包、地址和签名的实现

    在上一章节中,我们把简单的用户定义的字节当做地址来使用,比如在上一 章我测试用到的zyj和dxn.在这一章节中我们要正真的去实现区块链中的地址. 大家应该还记得上一章中提到过区块链中的交易是地址与地址 ...

  4. 区块链的分类与地址长度

        区块链有很多类型,比如,BTC.ETH.Solana等,每种类型的区块链其地址长度是不同的.BTC的地址长度为34, ETH的地址长度为42(包含前缀0x),Solana的地址长度的44.下面 ...

  5. 如何查区块链项目的服务器地址,怎么查区块链服务器地址

    怎么查区块链服务器地址 内容精选 换一换 区块链服务状态为"异常".•排查项一:区块链依赖的集群.服务器.存储等资源是否正常.•排查项二:云服务器节点资源规格不足.排查项一:区块链 ...

  6. 【区块链Solidity】智能合约与Solidity介绍

    目录 智能合约 Solidity语言简介 Solidity语言特性 智能合约 智能合约的英文是Smart Contract 最早是尼克丶萨博在1995年就提出了智能合约的概念~就是将法律条文写成可执行 ...

  7. 第4讲 | 区块链的应用类型

    我在前面的三篇文章中分别介绍了区块链是什么.区块链的运行原理.并且简述了区块链的共识机制,在这一篇文章中,我将为你讲解一下区块链的应用价值. 由于区块链本身发展处于早期阶段,成熟的应用并不是很多,我的 ...

  8. 以太坊区块链 Solidity solc是什么

    Solidity与Java类似.代码写好后,都需要通过编译器将代码转换成二进制. 在Java中,编译器是Javac, 对于Solidity,是solc. 生成后的二进制代码,会放到虚拟机里执行. Ja ...

  9. 区块链-高级密钥和地址

    目录:https://blog.csdn.net/qq_40452317/article/details/89646633 摘自<精通比特币> 1.加密私钥(BIP0038) 私钥必须保密 ...

最新文章

  1. 数据科学家:那些年,我都学过哪些编程语言…
  2. 深度有趣 | 26 Seq2Seq机器翻译
  3. 第1部分:Ajax 入门简介
  4. jquery实现表格的多行删除
  5. 网络IPC非阻塞和异步I/O
  6. windows中使用scrapyd遇到的问题
  7. JAVA中File转MultiparFile
  8. python office转pdf_python 如何将office文件转换为PDF
  9. Javascript 脚本错误.
  10. ubuntu之路——day7.1 衡量模型好坏的因素偏差和方差biasvariance 以及在深度学习中的模型优化思路...
  11. 计算机怎么关闭u盘系统还原,电脑系统还原错误怎么办
  12. 美国出台最严技术出口管制!14项前沿科技面临封锁
  13. [labview]做一个简单实用可扩展功能的高速串口发送(接收)调试器
  14. Apache ECharts 官网布局排版错乱的解决办法
  15. 新年最美表白烟花-祝大家新年快乐,表白成功
  16. iMeta:高颜值绘图网站imageGP+视频教程合集,已被引360次(220625更新)
  17. “华为”和“荣耀”哪个好?同等品质年轻人更喜欢Ta
  18. 设置CRT使用Console连接网络设备
  19. mysql 红黑树_微信大牛教你深入了解数据库索引
  20. 计算机硬件知识比赛策划,计算机硬件知识讲座活动策划案.doc

热门文章

  1. DtERP_erp企业资源计划系统
  2. 跟面试官谈【线程池】
  3. Android 本地路径问题
  4. Python实现简单的爬虫
  5. Spring-Boot整合微信登陆、微信支付、邮箱发送、支付宝支付和阿里云短信
  6. Python3下用tkinter和PIL实现简单的看图工具
  7. 厨电新十年,不可逆的行业分化与老板电器的数字进化
  8. python字符串切割以及正则表达式的简单实例操作
  9. OBU与千寻魔方的定位性能分析
  10. 微信平台申请消息接口时Signature校验的Servlet实现