以太坊开发者指南(二):开启交易的钥匙
欢迎回归!在本系列的第一部分中,我们通过与模拟以太坊网络的交互,深入探讨了诸多核心概念。现在,您应该对以下基本问题有了初步的认识:
- 什么是区块链,区块中包含哪些内容?
- 什么因素使得以太坊实现去中心化?
- 什么是以太(Ether),为何它是网络不可或缺的组成部分?
在本文中,我们将基于这些基础知识,进一步探讨它们对开发者的实际影响。如果您错过了第一部分或需要回顾,请务必返回查阅。
探索:账户
我们将从账户入手,深入剖析如何与以太坊网络进行交互。值得注意的是,以太坊账户与Web 2.0时代的账户存在显著差异。
注: “Web 2.0”一词最初用于描述引入用户生成内容(如社交媒体和博客)的互联网时代。而以太坊及其他去中心化技术则被视为下一代互联网——Web 3.0的基石。Web3的缩写已被Web3.js、web3.py等库及生态系统中的其他部分广泛采用。
Web2与Web3的对比
在当今的互联网环境中,账户几乎无处不在。从社交媒体应用到新闻网站,从快递服务到零售商和航空公司,无一不要求用户创建账户。然而,这些账户均存储在公司的服务器上,用户必须遵守相应的条款和条件、隐私政策及安全措施。更糟糕的是,用户账户可能因公司决策而被冻结、删除、审查或修改。
Web3则带来了账户管理的全新范式:您,且仅您,拥有对以太坊账户的绝对控制权。创建账户时,无需任何公司授权,且账户可随您在不同应用间自由迁移。事实上,创建以太坊账户根本无需与以太坊区块链进行交互。接下来,让我们通过实践来验证这一点。
注意: 本练习仅供学习之用。除非您充分了解安全隐患,否则请勿在账户中存储实际资产。某些错误可能无法挽回!更多背景信息将在后续介绍。
创建账户
账户生成
w3 = Web3()
acct = w3.eth.account.create()
print(acct.address) # 输出示例:'0xE51212f7D68f95600b502409E0f6ceD19c7a8ff8'
print(acct.key) # 输出示例:HexBytes('0x1b8ef920a15719317a4123ab7b8821c7a77d0d2641aa5cc74c77160617015787')
操作如此简单!无需注册,也无需与区块链或任何服务器进行交互。事实上,即使您完全断开网络连接,依然可以创建有效的以太坊账户。
在上述代码中,您会发现一个账户由两部分组成:一个公共地址和一个私钥。简而言之,私钥是账户的“密码”,而公共地址则是从私钥派生出来的、可共享的账号标识。如代码示例所示,两者通常均以十六进制数字表示。
使用账户
一个关键要点是:影响区块链更改的唯一途径是通过交易,且每笔交易都必须由账户签名。账户可发起多种交易,如转移以太币、部署智能合约或与合约交互以执行铸造新代币等操作。接下来,我们将简要探讨这三种交易类型。
转移以太币
回想一下,EthereumTesterProvider提供了一个包含账户和虚假以太币的测试环境。让我们先查看一些测试账户及其余额:
w3 = Web3(Web3.EthereumTesterProvider())
print(w3.eth.accounts) # 输出测试账户列表
acct_one = w3.eth.accounts[0]
print(w3.eth.get_balance(acct_one)) # 输出账户余额
接下来,我们创建一个新账户:
acct_two = w3.eth.account.create()
print(acct_two.address, acct_two.key) # 输出新账户的地址和私钥
然后,我们将一些虚假以太币发送到新账户:
tx_hash = w3.eth.send_transaction({
'from': acct_one,
'to': acct_two.address,
'value': Web3.to_wei(1, 'ether')
})
这笔交易将立即执行,但一些关键细节被隐藏了。web3.py足够智能,它知道EthereumTesterProvider正在管理acct_one,并且我们正在使用测试环境。为了方便起见,acct_one处于“解锁”状态,这意味着该账户的交易默认会被批准(签名)。
那么,如果不是来自解锁账户,交易会是什么样子呢?为了解答这个问题,让我们从acct_two(一个不受EthereumTesterProvider管理的账户)发送一些以太币。这个更手动的过程需要三个步骤:1)指定交易详细信息,2)签署交易,然后3)将交易广播到网络。
tx = {
'to': acct_one,
'value': 10000000,
'gas': 21000,
'gasPrice': w3.eth.get_block('pending')['baseFeePerGas'],
'nonce': 1
}
signed = w3.eth.account.sign_transaction(tx, acct_two.key)
tx_hash = w3.eth.send_raw_transaction(signed.raw_transaction)
让我们分解一下这个过程。第一步,定义一个包含所需交易字段的Python字典。我们在第一部分中简要了解了gas(交易费),但nonce可能是一个新概念。在以太坊中,nonce只是账户的交易计数。以太坊协议会跟踪这个值,以防止双花。
由于这是acct_two发起的第一笔交易,其nonce值为零。如果您提供错误的值,则结果为无效交易,并会被web3.py拒绝:
ValidationError: Invalid transaction nonce: Expected 1, but got 4
请注意,从acct_one发送交易时仍然需要一个随机数,但EthereumTesterProvider会跟踪管理账户的交易计数,并将适当的随机数添加到新交易中。
您可能注意到的另一个细节是tx中缺少from值。在这种情况下,sign_transaction方法可以根据发送者的私钥推断出其地址。同样,公共地址可以通过私钥推导出来,但私钥无法通过公共地址进行逆向工程。
最后,“原始”交易只是以字节形式表示的交易数据和签名。在底层,send_transaction执行与send_raw_transaction相同的编码。
部署智能合约
智能合约的完整介绍将在单独的博客文章中详细阐述,但这是一个很好的机会来提前了解一下。与智能合约的交互看起来与标准交易非常相似。
简而言之,智能合约是运行在以太坊区块链上的程序,任何人都可以使用。当您准备部署智能合约时,您需要将代码编译为字节码,并将其作为data值包含在交易中:
bytecode = "6080604052348015610...36f6c63430006010033"
tx = {
'data': bytecode,
'value': 0,
'nonce': 0,
# ...
}
除了需要更多gas之外,合约部署交易的唯一区别是没有to字段。其余流程与标准的ETH转账相同。
与智能合约交互
使用已部署的合约只是同一交易格式的另一种变体。在这种情况下,to值指向已部署合约的地址,而data值将根据正在执行的合约方法的输入而变化。
请注意,web3.py等工具提供了用于部署和与合约交互的更直观的界面:
# 与已存在合约交互:
myContract = web3.eth.contract(address=address, abi=abi)
twentyone = myContract.functions.multiply7(3).call()
# 部署新合约:
Example = w3.eth.contract(abi=abi, bytecode=bytecode)
tx_hash = Example.constructor().transact()
签名消息
交易是影响区块链状态的唯一途径,但并非账户的唯一用途。仅仅证明某个账户的所有权本身就很有用。
例如,以太坊市场OpenSea允许您通过使用您的账户签名消息来竞标待售物品。只有当拍卖到期或卖家接受您的出价时,才会进行实际交易。同样,该应用程序在向您显示一些账户详细信息之前,也会使用签名消息作为一种身份验证形式。
与交易不同,签名消息无需任何成本。它们不会广播到网络,也不会被打包到区块中。消息只是用私钥签名的一段数据。正如您所料,发送者的私钥是隐藏的,但接收者可以通过数学方法证明发送者的公开地址。换句话说,消息发送者无法被伪造。
注意: “链上”和“链下”这两个术语是指数据是否位于以太坊区块链上。例如,智能合约状态在链上管理,但消息签名在链下进行。
我们将在以后的文章中深入探讨消息签名,但这里有一些伪代码可以让您了解工作流程:
# 1. 编写消息
msg = "amanaplanacanalpanama"
# 2. 使用账户的私钥签名
pk = b"..."
signed_message = sign_message(message=msg, private_key=pk)
# 3. 发送`signed_message`
# 4. 消息接收者解码发送者的公共地址
sender = decode_message_sender(msg, signed_message.signature)
print(sender)
# 输出示例:'0x5ce9454...b9aB12E'
Web3账户对开发者的影响
我们可以非常轻松地创建以太坊账户:离线且独立于任何应用程序。这些账户可用于签署消息或发送各种类型的交易。这对应用程序开发者意味着什么呢?
永久密码与无恢复服务
现实是残酷的:基本账户类型没有密码恢复服务。如果您丢失了私钥和恢复短语,那么您只能与这个账户说再见了。这才是真正所有权的双刃剑。应用程序开发者有道德义务引导以太坊新手了解这一现实。
注: 设计恢复钱包可能会改善用户体验,“账户抽象化”是一项相关的研究工作——关于此主题,请另文探讨。
账户管理功能较少
鉴于用户在您的应用程序之外创建账户,您可能会发现您的用例几乎不需要或根本不需要账户管理功能。
新的商业模式
数据挖掘不会消失,但这种新的账户所有权模式为Web 2.0模式提供了一种健康的替代方案。在Web 2.0模式中,公司拥有用户的所有数据,并将其出售给出价最高的人。而以太坊的智能合约平台则提供了一个全新的激励机制。
新的软件架构
在定义您的商业模式时,一个有趣的问题是如何处理链上和链下的数据。正如我们所讨论的,消息签名不需要链上交互。此外,您也可以使用私有数据库存储部分数据,并使用以太坊区块链存储其他数据或功能。有很多权衡需要考虑:可用性、成本、透明度、去中心化、隐私等等。
您可以创建的账户数量没有限制,您可以自由地将同一个账户用于多个应用,也可以为每个应用创建一个新账户。这正是公链被称为“无需许可”的原因之一:您和网络之间没有守门人。无需等待任何人授予您创建网络的权限。
当您准备好继续前进时,第三部分将介绍系统中的下一个参与者:智能合约。
921

被折叠的 条评论
为什么被折叠?



