什么是(技术上)以太坊地址?
哈希函数是创建地址的关键元素。以太坊使用keccak-256哈希函数来生成它们。
在 Ethereum 和 Solidity 中,一个20 字节值大小(160 位或 40 个十六进制字符)的地址。它对应于公钥的 Keccak-256 散列的最后 20 个字节。
一个地址以0x
十六进制格式(base 16 notation)表示的(明确定义)。
地址的生成
1.公钥是使用 ECDSA(椭圆曲线数字签名算法)从私钥派生而来的。以太坊使用与比特币相同类型的曲线
- 将 Keccak-256 散列应用于公钥。您应该获得一个长度为 64 个字符/32 个字节的字符串。
Keccak256(pubKey) = 2a5bc342ed616b5ba5732269001d3f1ef827552ae1114027bd3ecf1f086ba0f9
3. 取结果哈希的最后 40 个字符/20 个字节(最低有效字节)。(换句话说,删除前 24 个字符/12 个字节)。
这 40 个字符 / 20 个字节是地址(下面用粗体表示)。
2a5bc342ed616b5ba5732269 001d3f1ef827552ae1114027bd3ecf1f086ba0f9 地址 = 0x 001d3f1ef827552ae1114027bd3ecf1f086ba0f9
当以 0x 为前缀时,地址实际上变成了 42 个字符长。
它们不区分大小写
0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9或 0X001D3F1EF827552AE1114027BD3ECF1F086BA0F9
合约地址
合约地址的创建方式不同。它们是从两件事确定性地计算出来的:
- 其创建者的地址:
sender
- 创建者发送了多少笔交易:
nonce
创建合约地址的步骤
- 采取
sender
和nonce
价值观。- RLP 对它们进行编码
- 用Keccak-256 对它们进行哈希处理
Solidity 中的地址
1。定义地址类型的变量
- 要定义地址类型的变量,请
address
在变量名前指定关键字。
1.
address 用户 = msg.sender
Solidity 内置函数`msg.sender`来检索与智能合约交互的当前账户的地址。
2.
address owner= 0xc0ffee254729296a45a3885639AC7E10F9d54979
地址必须具有有效的校验和。如果它们没有通过校验和测试,Remix 或 Solidity 编译器会发出警告,并将其视为常规有理数
2.address
与address 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
类型的方法:call、delegatecode和staticcall.
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
不允许算术运算。