以太坊钱包地址位数验证
以太坊中的地址的长度为20
字节,一字节等于8位,一共160
位,所以address
其实亦可以用uint160
来声明。
我的以太坊钱包的地址为0xF055775eBD516e7419ae486C1d50C682d4170645
,0x
代表十六进制,我们将F055775eBD516e7419ae486C1d50C682d4170645
拷贝,如下图所示,将其进行二进制转换,不难发现,它的二进制刚好160
位。
备注:以太坊钱包地址是以16进制的形式呈现,我们知道一个十六进制的数字等于4
个字节,160 / 4 = 40
,你自己验证一下,钱包地址F055775eBD516e7419ae486C1d50C682d4170645
的长度为40。
我的以太坊钱包地址:
0xF055775eBD516e7419ae486C1d50C682d4170645
对应的二进制为:
0b1111 0000 0101 0101 0111 0111 0101 1110 1011 1101 .....0100 0101
PS:通过工具进行转换完的二进制有问题,所以自己去计算一下即可。
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;
contract AddressTest{
address _owner;
uint160 _ownerUint;
constructor() public {
_owner = 0xF055775eBD516e7419ae486C1d50C682d4170645;
_ownerUint = 1372063746939811866332913075223978746532890871365;
}
function owner() view public returns (address) {
return _owner; //0xF055775eBD516e7419ae486C1d50C682d4170645;
}
function ownerUint160() view public returns (uint160) {
return uint160(_owner);
// 1372063746939811866332913075223978746532890871365
}
function ownerUintToAddress() view public returns (address) {
return address(_ownerUint); //0xF055775eBD516e7419ae486C1d50C682d4170645;
}
}
// 0x 45
// 0b 0100 0101
// 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128
// 1 + 0 + 4 + 0 + 0 + 0 + 64 + 0 = 69
// 1 2 3 4 5 6 7 8 9 A B C D E F
// 0xF055775eBD516e7419ae486C1d50C682d4170645
// 1372063746939811866332913075223978746532890871365
// 0b1111 0000 0101 0101 0111 0111 0101 1110 1011 1101 .....0100 0101
//
// 40 * 4 = 160
// uint160
// address
// uint160
由上不难看出address
和uint160
之间可以来回相互转换,其实address
本身就不是一个什么新的特殊类型,它其实就是uint160
的别名或者变体,相互等价。
不可不知的几个常识
msg.sender
是什么?
当前哪个地址身份在操作或者调用合约,谁就是当前的msg.sender
,我们来测试一下。
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;
contract Msg_Sender_Test{
function msgSenderAddress() view public returns (address) {
return msg.sender;
}
}
- 合约地址
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;
contract ContractAddress{
function msgSenderAddress() view public returns (address) {
return msg.sender;
}
function returnContractAddress() view public returns (ContractAddress) {
return this;
}
}
msg.sender
等价于from
,而this
就是当前合约实例对象的地址,通过合约地址,可以调用合约对象的相关行为和方法。
支持的运算符
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;
contract ContractAddress{
address address1;
address address2;
// <=,<,==,!=,>=和>
constructor() public {
address1 = 0xF055775eBD516e7419ae486C1d50C682d4170645;
address2 = 0xEAEC9B481c60e8cDc3cdF2D342082C349E5D6318;
}
// <=
function test1() view public returns (bool) {
return address1 <= address2; //0: bool: false
}
// <
function test2() view public returns (bool) {
return address1 < address2; //0: bool: false
}
// !=
function test3() view public returns (bool) {
return address1 != address2; //0: bool: true
}
// >=
function test4() view public returns (bool) {
return address1 >= address2; //0: bool: true
}
// >
function test5() view public returns (bool) {
return address1 > address2; //0: bool: true
}
}
成员变量(属性)和行为(函数)
一、 balance
如果我们需要查看一个地址的余额,我们可以使用balance
属性进行查看。
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;
contract addressBalance{
function getBalance(address addr) view public returns (uint){
return addr.balance;
}
}
//0x1be305609d44753B8e333dc72B8EF002832e4EAd
//99999999999999587411
//0xC370B1f39b2A0eb55dEA03f5db0bb2658422c876
//100000000000000000000
99999999999999587411 wei => 99.999999999999587411 ether
100000000000000000000 wei => 100 ether
二、this 查看当前合约地址余额
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;
contract addressBalance{
function getBalance() view public returns (uint){
return address(this).balance; // 1. 直接通过this查看当前合约地址余额
}
function getContractAddrees() view public returns (addressBalance){
return this; //2. 查看当前合约地址
}
function getBalance(address addr) view public returns (uint){
return addr.balance; // 3. 传入合约地址查看合约地址的余额
}
}
三、transfer
transfer:从合约发起方向某个地址转入以太币(单位是wei),地址无效或者合约发起方余额不足时,代码将抛出异常并停止转账。
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;
contract PayableKeyword{
// 从合约发起方向 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E 地址转入 msg.value 个以太币,单位是 wei
function deposit() payable public {
address payable Account2 = 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E;
Account2.transfer(msg.value);
}
// 读取 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E 地址的余额
function getAccount2Balance() view public returns (uint) {
address Account2 = 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E;
return Account2.balance;
}
// 读取合约发起方的余额
function getOwnerBalance() view public returns (uint) {
address Owner = msg.sender;
return Owner.balance;
}
}
演示步骤:
- 查看当前
msg.sender
地址余额 - 查看
0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E
地址余额 - 将
wei
切换为ether
- 输入转账数量
- 调用
deposit()
方法发起转账 - 再次查看
0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E
地址余额 - 再次查看当前
msg.sender
地址余额
四、send
send:send
相对transfer
方法较底层,不过使用方法和transfer
相同,都是从合约发起方向某个地址转入以太币(单位是wei),地址无效或者合约发起方余额不足时,send
不会抛出异常,而是直接返回false
。
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.7.0;
contract PayableKeyword{
// 从合约发起方向 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E 地址转入 msg.value 个以太币,单位可选
function deposit() payable public returns(bool) {
address payable Account2 = 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E;
return Account2.send(msg.value);
}
// 读取 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E 地址的余额
function getAccount2Balance() view public returns (uint) {
address Account2 = 0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E;
return Account2.balance;
}
// 读取合约发起方的余额
function getOwnerBalance() view public returns (uint) {
address Owner = msg.sender;
return Owner.balance;
}
}
演示步骤:
- 查看当前
msg.sender
地址余额 - 查看
0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E
地址余额 - 将
wei
切换为ether
- 输入转账数量
- 调用
deposit()
方法发起转账 - 再次查看
0x15d1B25353A14Cc2F4cBEcF7b9CAC3A83128138E
地址余额 - 再次查看当前
msg.sender
地址余额
最新评论
大佬,这些课程在哪学习?有课程来源吗?
黎老师 您好 我是一名asp.net的后端工程师,想转职为智能合约开发工程师,但对于区块链我是完全的小白。 目前正在考虑您腾讯课堂的"从零构建以太坊智能合约到项目实战课程"。 请问这课程是否适合我这样的小白? 学完这教程是否足够我应付智能合约开发实务工作?如果不够,有什么补足的建议? 另外课程购买页面有同学评论这课程的技术和网站过时,不知道是否还适合目前(2022年)的开发场景呢?如果仅需更新部分技术点,学完您的课程后我该如何加强? 期待您的回覆,感谢您
那就还是像电影里那样?举个例子:开会的时候不必到现场,啪的一下几个全息人像出现在眼前?
不管元宇宙是什么、怎么定义,都需要一个降温来冷静清醒一下,然后再继续发展吧。VR都喊了多少年了,每年都说一句话“今年是VR元年”,都已经麻木了,元宇宙真的想好好发展下去,感觉也需要先冷静一下,不然还是炒热度的居多
元宇宙不是游戏和VR!目前市场上的元宇宙大家还在谈论更好体验的游戏、娱乐和VR,甚至很多忽悠和骗子,没有达到现实虚拟化和虚拟现实化,更无法实现能量和价值的虚实转换、没有虚拟与现实的多发并行和交互融合! 元宇宙Metaverse是:人类的数字世界DigiVerse(现实虚拟化)和数字的人类生活RealVirtual(虚拟现实化),并与现实世界Universe多发并行和交互作用,达到虚实(Metaverse+Universe)交融。其3D空间无限,第4维的时间的穿越伸缩,在更高维度上,成就二者的融合共生和价值交融(HumanVerse) Metaverse + Universe = Humanverse!
元宇宙不是游戏和VR!目前市场上的元宇宙大家还在谈论更好体验的游戏、娱乐和VR,甚至很多忽悠和骗子,没有达到现实虚拟化和虚拟现实化,更无法实现能量和价值的虚实转换、没有虚拟与现实的多发并行和交互融合! 元宇宙Metaverse是:人类的数字世界DigiVerse(现实虚拟化)和数字的人类生活RealVirtual(虚拟现实化),并与现实世界Universe多发并行和交互作用,达到虚实(Metaverse+Universe)交融。其3D空间无限,第4维的时间的穿越伸缩,在更高维度上,成就二者的融合共生和价值交融(HumanVerse) Metaverse + Universe = Humanverse!
元宇宙不是游戏和VR!目前市场上的元宇宙大家还在谈论更好体验的游戏、娱乐和VR,甚至很多忽悠和骗子,没有达到现实虚拟化和虚拟现实化,更无法实现能量和价值的虚实转换、没有虚拟与现实的多发并行和交互融合! 元宇宙Metaverse是:人类的数字世界DigiVerse(现实虚拟化)和数字的人类生活RealVirtual(虚拟现实化),并与现实世界Universe多发并行和交互作用,达到虚实(Metaverse+Universe)交融。其3D空间无限,第4维的时间的穿越伸缩,在更高维度上,成就二者的融合共生和价值交融(HumanVerse) Metaverse + Universe = Humanverse!