address对象

什么是(技术上)以太坊地址?

哈希函数是创建地址的关键元素。以太坊使用keccak-256哈希函数来生成它们。

在 Ethereum 和 Solidity 中,一个20 字节值大小(160 位或 40 个十六进制字符)的地址。它对应于公钥的 Keccak-256 散列的最后 20 个字节

一个地址以0x十六进制格式(base 16 notation)表示的(明确定义)。

地址的生成

1.公钥是使用 ECDSA(椭圆曲线数字签名算法)从私钥派生而来的。以太坊使用与比特币相同类型的曲线

  1. 将 Keccak-256 散列应用于公钥。您应该获得一个长度为 64 个字符/32 个字节的字符串。
Keccak256(pubKey) = 2a5bc342ed616b5ba5732269001d3f1ef827552ae1114027bd3ecf1f086ba0f9

3. 取结果哈希的最后 40 个字符/20 个字节(最低有效字节)。(换句话说,删除前 24 个字符/12 个字节)。

这 40 个字符 / 20 个字节是地址(下面用粗体表示)。

2a5bc342ed616b5ba5732269 001d3f1ef827552ae1114027bd3ecf1f086ba0f9
地址 = 0x 001d3f1ef827552ae1114027bd3ecf1f086ba0f9

当以 0x 为前缀时,地址实际上变成了 42 个字符长。

它们不区分大小写

从 EIP-55 开始,大写地址用于验证校验和

0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9或
0X001D3F1EF827552AE1114027BD3ECF1F086BA0F9

合约地址

合约地址的创建方式不同。它们是从两件事确定性地计算出来的:

  • 其创建者的地址:sender
  • 创建者发送了多少笔交易:nonce

创建合约地址的步骤

  1. 采取sendernonce价值观。
  2. RLP 对它们进行编码
  3. Keccak-256 对它们进行哈希处理

Solidity 中的地址

1。定义地址类型的变量

  • 要定义地址类型的变量,请address在变量名前指定关键字。
1.
address 用户 = msg.sender

Solidity 内置函数`msg.sender`来检索与智能合约交互的当前账户的地址。

2.
address owner= 0xc0ffee254729296a45a3885639AC7E10F9d54979

地址必须具有有效的校验和。如果它们没有通过校验和测试,Remix 或 Solidity 编译器会发出警告,并将其视为常规有理数

2.addressaddress payable

Solidity 0.5.0 版中引入

想法是区分可以收款的地址和不能收款的地址(用于其他目的)

从发送者的角度来看:
您可以将 Ether 发送到定义为的变量address payable
您不能将 Ether 发送到定义为的变量address

msg.sender 返回的是payable类型

方法

payable address支持以下方法

1 Ether = 10¹⁸ Wei

_address.balance(uint256)
#_amount 参数是wei为单位

_payable_address.transfer(uint256 _amount)

_payable_address.send(uint256 _amount) returns (bool)

_payable_address.call(bytes memory) returns (bool, bytes memory)

_payable_address.delegatecall(bytes memory) returns (bool, bytes memory)

_payable_address.staticcall(bytes memory) returns (bool, bytes memory)

与地址相关的solidity方法或交易类型分为2类:

  • 与以太有关的方法.balance().transfer().send()
  • 与合约交互相关的方法.call().delegatecall().staticcall()

以太相关

address.balance		#所有地址类型都可使用
返回以 Wei 为单位的帐户余额。

#查看余额
_account.balance
address(_account).balance
如果要获取当前合约的余额,使用address(this)(显式转换)

<address>.balance被认为是从状态读取,因为它访问区块链数据。
_address.transfer()
  • 将以太币数量(以wei为单位)转入指定账户。
  • 失败时恢复并在任何错误时抛出异常。
  • 转发 2,300 汽油费,不可调节。

.transfer()函数通过余额属性来查询地址的余额,然后再发送以太币。

address.send()

  • 失败时返回错误。
  • 转发 2,300 汽油费,不可调节。

合约相关

Solidity 为调用其他合约中的函数提供了高级语法

targetContract.doSomething(...)
这种高级语法仅在目标合约的接口在编译时时可用。

EVM 提供了4种 特殊的操作码来与其他智能合约交互,其中 3 种可用作以下address类型的方法:calldelegatecodestaticcall.

callcode**现在已弃用,**但仍可用于低级程序集

类型转换

  • 允许从address payable隐式转换address

反过来转换为address payable的唯一方法是使用中间转换到uint160

返回地址类型的方法

1.msg.sender()

功能:msg.sender()-> 返回:address payable

msg.sender函数返回启动此合约调用的地址

返回**当前调用。**它不一定会返回发送交易的原始角色

如果我们的合约 A 被 EOA 交易直接调用,那么msg.sender将返回 EOA 的地址。
如果我们的合约 A 被另一个合约 B 调用,而 B 被 EOA 交易调用,那么msg.sender将返回合约 B 的地址。

2.tx.origin (警告 -> 不安全 !!!)

功能:tx.origin()-> 返回:address payable

tx.origin返回此交易的原始 EOA 的地址。因此,它返回完整的调用链。

3.block.coinbase()

功能:**block.coinbase()**-> 返回:**address payable**

block.coinbase(_address payable)

当前区块矿工的地址。

零地址

编译智能合约后,将使用特殊交易将其部署在以太坊网络上。但是,交易意味着发送者和接收者

在以太坊上注册合约涉及创建一个特殊交易,其目的地是地址`0x0000000000000000000000000000000000000000`,也称为零地址。

当交易在接收者字段中指定一个称为零地址的特定地址时,创建一个新合约。

限制

address不允许算术运算。

猜你喜欢

转载自blog.csdn.net/weixin_44932880/article/details/124825331
今日推荐