区块链:Solidity值类型(地址Address)
地址Address
以太坊钱包地址位数验证
以太坊中的地址的长度为20字节
,一字节等于8位
,一共160位
,所以address
其实亦可以用uint160
来声明。
我的以太坊钱包地址为0xDF12793CA392ff748adF013D146f8dA73df6E304
,0x
代表十六进制
,我们将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
等于1000000000000000000Wei
,Wei是最小单位
,相当于我们的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)相关推荐
- 区块链solidity学习(地址、交易篇:一)
(1)下图为remix中有关地址交易的代码展示: 只要与交易相关的function函数,则需要加上 payable 标识,否则会导致不能进行交易: 外部两个不同的账户进行转账时,使用 transfer ...
- 基于Java语言构建区块链(五)—— 地址(钱包)
基于Java语言构建区块链(五)-- 地址(钱包) 2018年03月25日 18:02:06 wangwei_hz 阅读数:1292更多 个人分类: 区块链bitcoin比特币 文章的主要思想和内容均 ...
- golang重写区块链——0.5 区块链中钱包、地址和签名的实现
在上一章节中,我们把简单的用户定义的字节当做地址来使用,比如在上一 章我测试用到的zyj和dxn.在这一章节中我们要正真的去实现区块链中的地址. 大家应该还记得上一章中提到过区块链中的交易是地址与地址 ...
- 区块链的分类与地址长度
区块链有很多类型,比如,BTC.ETH.Solana等,每种类型的区块链其地址长度是不同的.BTC的地址长度为34, ETH的地址长度为42(包含前缀0x),Solana的地址长度的44.下面 ...
- 如何查区块链项目的服务器地址,怎么查区块链服务器地址
怎么查区块链服务器地址 内容精选 换一换 区块链服务状态为"异常".•排查项一:区块链依赖的集群.服务器.存储等资源是否正常.•排查项二:云服务器节点资源规格不足.排查项一:区块链 ...
- 【区块链Solidity】智能合约与Solidity介绍
目录 智能合约 Solidity语言简介 Solidity语言特性 智能合约 智能合约的英文是Smart Contract 最早是尼克丶萨博在1995年就提出了智能合约的概念~就是将法律条文写成可执行 ...
- 第4讲 | 区块链的应用类型
我在前面的三篇文章中分别介绍了区块链是什么.区块链的运行原理.并且简述了区块链的共识机制,在这一篇文章中,我将为你讲解一下区块链的应用价值. 由于区块链本身发展处于早期阶段,成熟的应用并不是很多,我的 ...
- 以太坊区块链 Solidity solc是什么
Solidity与Java类似.代码写好后,都需要通过编译器将代码转换成二进制. 在Java中,编译器是Javac, 对于Solidity,是solc. 生成后的二进制代码,会放到虚拟机里执行. Ja ...
- 区块链-高级密钥和地址
目录:https://blog.csdn.net/qq_40452317/article/details/89646633 摘自<精通比特币> 1.加密私钥(BIP0038) 私钥必须保密 ...
最新文章
- 数据科学家:那些年,我都学过哪些编程语言…
- 深度有趣 | 26 Seq2Seq机器翻译
- 第1部分:Ajax 入门简介
- jquery实现表格的多行删除
- 网络IPC非阻塞和异步I/O
- windows中使用scrapyd遇到的问题
- JAVA中File转MultiparFile
- python office转pdf_python 如何将office文件转换为PDF
- Javascript 脚本错误.
- ubuntu之路——day7.1 衡量模型好坏的因素偏差和方差biasvariance 以及在深度学习中的模型优化思路...
- 计算机怎么关闭u盘系统还原,电脑系统还原错误怎么办
- 美国出台最严技术出口管制!14项前沿科技面临封锁
- [labview]做一个简单实用可扩展功能的高速串口发送(接收)调试器
- Apache ECharts 官网布局排版错乱的解决办法
- 新年最美表白烟花-祝大家新年快乐,表白成功
- iMeta:高颜值绘图网站imageGP+视频教程合集,已被引360次(220625更新)
- “华为”和“荣耀”哪个好?同等品质年轻人更喜欢Ta
- 设置CRT使用Console连接网络设备
- mysql 红黑树_微信大牛教你深入了解数据库索引
- 计算机硬件知识比赛策划,计算机硬件知识讲座活动策划案.doc