以太坊地址Address介绍附代码示例

Address是什么

通常情况下,地址代表一外部账户或合约账户,它们都可以在区块链上接收(目标地址)或发送(源地址)。 更具体地说,它是根据ECDSA算法,从公钥的Keccak-256哈希值的最后20个字节导出的标识符,一个十六进制数字

账户类型

There are two types of accounts in the Ethereum Chain

(1). Externally Owned Accounts(EOA) [Person]

(2). Contracts Accounts [Contracts on Chain]​​​​​

翻译过来就是:

以太坊链中有两种类型的账户

  • 外部账户(个人持有)
  • 合约账户(链上合约)

外部账户

外部帐户 (EOA) 是由控制帐户私钥的用户所管理的帐户,通常使用助记词生成。 外部帐户是没有任何关联代码的帐户。 通常,这些帐户与钱包
一起使用。

合约账户

一个包含代码的帐户,只要接收到来自其他帐户(外部帐户或合约)的交易,就会执行该代码。

代码示例

1、获取合约账户

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract AddressExample {

    function getContractAddress() external view returns(address) {
        return address(this); 
        // return this; // 报错
    }

}

注意:合约账户需要使用address()进行显示转换为address类型。

如果直接返回this的话,则会抛出如下错误;

TypeError: Return argument type contract AddressExample is not implicitly convertible to expected type (type of first return variable) address.
--> contract-demo/AddressExample.sol:15:16:
|
15 | return this;
| ^^^^

2、获取msg.sender

 function getSenderAddress() external view returns(address) {
        return msg.sender;
    }

msg.sender 表示消息的发送者(当前通话)。它可以指代调用函数或创建交易的地址,可以是合约地址,或者是像你我这样的人的账户地址。

随着上面选取的地址切换而关联改变的。 

但不少人(包括我)曾经一度认为msg.sender就是部署合约的外部账户,是唯一的。造成这种错觉的原因是忽略了一个细节。

address ownerAddress;

constructor() {
      ownerAddress = msg.sender;
}

就是说合约创建者在构造函数已经初始化,将msg.sender定死为合约的拥有者(owner),所以之后的一系列对合约的操作,都可以借助ownerAddress这一凭证实现访问权限控制。

3、获取余额

 function getBalance() external view returns(uint, uint, uint) {
        uint contractBalance = address(this).balance; // 合约账户余额
        uint senderBalance = msg.sender.balance;  // 调用者账户余额
        uint ownerBalance = ownerAddress.balance; // 合约拥有者余额

        return (contractBalance, senderBalance, ownerBalance);
    }

注意我切换到另一个账户,调用的getBalance方法,这样可以比较调用者和拥有者的余额。

 

参考:  https://ethereum.org/zh/glossary/#address

             blockchain - Solidity basics: what "msg.sender" stands for - Stack Overflow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python以太坊交易是指使用Python编程语言进行以太坊区块链上的交易操作。以太坊是一种基于区块链技术的智能合约平台,它允许开发者构建和部署去中心化应用程序(DApps)。 在Python中,可以使用以太坊的官方库web3.py来进行以太坊交易的编程操作。web3.py提供了一系列的API,可以与以太坊节点进行通信,并执行各种操作,包括创建账户、发送交易、查询余额等。 以下是一个简单的Python代码示例,展示了如何使用web3.py库发送以太坊交易: ```python from web3 import Web3 # 连接到以太坊节点 w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/your_infura_project_id')) # 设置发送方账户私钥和接收方地址 private_key = 'your_private_key' receiver_address = '0x1234567890abcdef1234567890abcdef12345678' # 构建交易参数 transaction = { 'to': receiver_address, 'value': w3.toWei(1, 'ether'), 'gas': 21000, 'gasPrice': w3.toWei('50', 'gwei'), 'nonce': w3.eth.getTransactionCount(w3.eth.accounts), } # 签名交易 signed_transaction = w3.eth.account.signTransaction(transaction, private_key) # 发送交易 transaction_hash = w3.eth.sendRawTransaction(signed_transaction.rawTransaction) # 等待交易确认 transaction_receipt = w3.eth.waitForTransactionReceipt(transaction_hash) # 打印交易结果 print('交易成功,交易哈希:', transaction_receipt.transactionHash.hex()) ``` 上述代码中,首先使用`Web3`类连接到以太坊节点。然后设置发送方账户的私钥和接收方地址。接下来,构建交易参数,包括接收方地址、转账金额、燃气限制、燃气价格和交易序号。然后使用发送方账户的私钥对交易进行签名,并发送签名后的交易到以太坊网络。最后,等待交易被确认,并打印交易结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值