以太坊101:账户,交易和消息

以太坊的状态由账户组成,这些账户之间的交易推动了网络的发展,并确保网络验证节点为保护区块链而贡献安全的工作量证明计算时,能够获得适当的补偿。

以太坊的状态由账户组成,这些账户之间的交易推动了网络的发展,并确保网络验证节点为保护区块链而贡献安全的工作量证明计算时,能够获得适当的补偿。 区块链是一个状态转换系统。“状态”是指一个包含所有现有的以太坊账户、智能合约以及以太币所有权的账本。在“状态转换函数”中,状态被用于执行一笔交易,并且该交易的输出变成新的状态。当交易由外部账户提交到网络时,它们将以太坊区块链移动到最新状态。 ## **快速概览** 在以太坊中,存在两种不同类型的账户:外部拥有账户(简称EOA)和合约账户。 外部拥有账户由对应的私钥控制,而合约账户则由对应的合约EVM字节码控制,这部分内容接下来会有相关介绍。 地址(提示:请勿给以下地址转账,否则可能会发生损失)的格式样例如下: 0xab6291d3B3290e7F2287dE751Fb5FDDA4B91ebB6 地址是你的账户对外展现的元素。如果你要接收以太币,则应将这笔交易定向到你的地址。地址只不过公钥的Keccak-256哈希,本节并未给出公钥的格式样例。 私钥的格式样例如下: aa50f1a46ecb19a2464cfdd43f0d31ad32f4bb598df3ed5a448a43ab5d02f0ef 通过这个密钥,你可以控制上述地址 ## **技术资料补充** ### **助记词短语和BIP39** 一些去中心化应用和钱包会使用助记词短语或JSON文件进行账户恢复(例如,MetaMask使用包含12个单词的种子短语来进行账户恢复)。与私钥类似,助记词短语和密钥库文件(通常是JSON文件)应当得到适当保护。 ### **资源:** https://iancoleman.io/bip39/ & https://github.com/iancoleman/bip39 如果有人知道了你的助记词短语或者拿到你的JSON密钥库文件,那么他们可能会恢复你的账户并获得你的资金使用权。 更多信息,请参考MetaMask(https://support.metamask.io/)和MyEtherWallet(https://myetherwallet.github.io/knowledge-base/)的知识库。 ## **非对称密码学入门** 以太坊账户是通过复杂且内在安全的非对称加密技术产生的。以太坊账户的创建共分为三个步骤: 首先,随机生成包含64个字符的十六进制私钥。 其次,通过采用该包含64个字符的十六进制私钥,并应用椭圆曲线乘法来生成公钥(这是不可逆的计算)。 最后,获得新生成的公钥的Keccak-256哈希值,并取该哈希的最后,即最右边的40个字符,冠以“0x”前缀,由此得到账户地址。 通过使用我们的账户衍生的非对称私钥和地址,我们就可以开始执行交易。“交易”这一术语是指从外部拥有账户发送的签名数据包。与交易类似,消息调用是由合约而不是外部拥有账户产生的。合约甚至可以再次调用其他合约。在以太坊白皮书的描述中,合约并不是必须履行的对象,它只是区块链上的代码块,当由外部拥有账户或另一个合约(通过消息调用)调用该代码块时执行。 如果我们在两个外部账户之间进行原始交易,那么这个过程非常简单。首先,我们需要三个参数:发送交易的账户、将要接收交易值的账户以及交易值。当然,这里面还需要其他参数:nonce(随机数),gasLimit和gasPrice。然而,我们不需要亲自获取这些值,因为它们将由geth控制台填充。 nonce:这是发送交易的账户的交易数(注意不要与工作量证明的随机数混淆,这是完全不同的随机数)。 gasLimit(STARTGAS):由外部拥有账户支付的预付款,用于设置执行交易的最高价格。如果所有的gas都用完了,那么交易将恢复为之前的状态。通常情况下,未花费的gas会被返还给交易发送方。 gasPrice(GASPRICE):外部拥有账户为执行交易而支付的每一个计算步骤(EVM操作码)的价值。 ## **使用ethereumjs-tx发送交易** 在本文中,我们将使用ethereumjs-tx执行交易。其安装步骤十分简单,请使 用以下命令: ![](https://img.learnblockchain.cn/2020/07/10/15943639258342.jpg) 接下来,我们不妨运行一个geth控制台并获取一些值,以帮助我们更好地定义交易参数。我们可以使用Rinkeby测试网来进行此练习。你将需要从Rinkeby水龙头@https://faucet.rinkeby.io/获取测试网以太币。 打开终端并输入以下geth命令: ![](https://img.learnblockchain.cn/2020/07/10/15943639392328.jpg) 利用第二个终端查看geth的反馈信息 ![](https://img.learnblockchain.cn/2020/07/10/15943639489108.jpg) 在我们的geth节点中使用以下命令来获取交易随机数: ![](https://img.learnblockchain.cn/2020/07/10/15943639605243.jpg) 现在,我们已经获得了交易随机数,我们再加入其他将交易发送到以太坊网络的代码。需要注意的是,了解交易随机数及其如何防止在以太坊区块链上发生双重花费十分重要。假设账户A向账户B发送3个以太币,并且账户A的账户中仅包含3个以太币。账户A签署这笔交易并将其广播到网络。随后,,账户A立马使用更高的gas价格签署并向账户C广播了第二笔花费3以太币的交易。更高的gas价格将使第二笔交易在待打包交易池中排到更高的队列,从而有效地执行了双重花费。 随机数的使用可以防止这种双重花费的发生,因为账户交易需要按序进行。在上述示例中,假设账户的随机数为0,第一笔交易将被写入区块链。即使gas的价格更高,第二笔交易也会被拒绝,因为其随机数比第一笔交易的随机数大1。区块链会认为,即使账户A以更高的gas价格发送交易,账户A也没有足够的以太币来执行第二笔交易,因此拒绝该第二笔交易。 我们的node.js控制台: ![](https://img.learnblockchain.cn/2020/07/10/15943639742957.jpg) 上述console.log(rawTxn)命令将返回原始交易字符串。我们可以使用以下命令将这个原始交易字符串输入到geth控制台中: > eth.sendRawTransaction(“0xf86d018520540be400839752e094a18d70840b9bc475ba15f4f6a98d 2967744fe4c1882fe01dba2bb1dffe001ba0984e42f70a04d17e56b965423ae83527ee701cfb56e2b701b8b46e9c94461303a01ffd3efc1bcc7eb5f85fa1929cb2ca52706a59f0c48febe488c3c56aee5d164e”) 在第二个终端中,你会得到类似于以下内容的输出: > INFO [XX-XX|XX:XX:XX] Submittedtransaction ... 总而言之,上述教程展示了如何从外部拥有账户发送交易。最重要的是,我们要了解合约并不能启动交易。合约能够将消息发送给其他合约,但是,在这一步之前,合约必须首先从外部拥有账户接收消息。 合约消息是不同的,它们没有gas上限,因此由外部拥有账户发起交易的费用必须足以完成整个执行过程。如果消息执行耗尽了所有的gas,那么该特定消息将停止并恢复为先前的状态,即解除先前所有的计算步骤,并有效地恢复其先前的状态。我们会说这是一笔不成功的交易。 Since we sent theabove transaction on the Rinkeby testnet, you could simply use Etherscan toview your address, the transactions you’resending and receiving at that address, as well as the externally owned accountsand contracts that received your test ether. Many decentralized apps referenceEtherscan to obtain a quick glimpse of your activity on the blockchain. Take amoment to review: https://etherscan.io 由于我们是通过Rinkeby测试网来发送上述交易的,因此你只需要使用Etherscan即可查看你的地址、在该地址发送和接收的交易以及接收你的测试以太币的外部拥有账户和合约。许多去中心化应用都会参考Etherscan,以快速了解你在区块链上的活动。你可以花点时间在此回顾一下你的区块链交易:https://etherscan.io ## **其他Web3库** ### **Web3js - JavaScript** Github: https://github.com/ethereum/web3.js/ Docs: https://web3js.readthedocs.io/en/1.0/ ### **Web3py - Python** Github: https://github.com/ethereum/web3.py Docs: https://web3py.readthedocs.io/en/stable/ ### **Web3j - Java** Github: https://github.com/web3j/web3j Docs: https://docs.web3j.io/ ## **补充阅读:** 以太坊白皮书: https://github.com/ethereum/wiki/wiki/White-Paper#messages-and-transactions 以太坊黄皮书: https://ethereum.github.io/yellowpaper/paper.pdf 本文翻译:Jacky 本文校对:Jacky/Vivian 原文作者:Wil 原文链接: https://kauri.io/ethereum-101-part-4-accounts-transactions-and-me/7e79b6932f8a41a4bcbbd194fd2fcc3a/a ![](https://img.learnblockchain.cn/pics/20200602162317.png!/scale/20)

以太坊的状态由账户组成,这些账户之间的交易推动了网络的发展,并确保网络验证节点为保护区块链而贡献安全的工作量证明计算时,能够获得适当的补偿。

区块链是一个状态转换系统。“状态”是指一个包含所有现有的以太坊账户、智能合约以及以太币所有权的账本。在“状态转换函数”中,状态被用于执行一笔交易,并且该交易的输出变成新的状态。当交易由外部账户提交到网络时,它们将以太坊区块链移动到最新状态。

快速概览

在以太坊中,存在两种不同类型的账户:外部拥有账户(简称EOA)和合约账户。

外部拥有账户由对应的私钥控制,而合约账户则由对应的合约EVM字节码控制,这部分内容接下来会有相关介绍。

地址(提示:请勿给以下地址转账,否则可能会发生损失)的格式样例如下:

0xab6291d3B3290e7F2287dE751Fb5FDDA4B91ebB6

地址是你的账户对外展现的元素。如果你要接收以太币,则应将这笔交易定向到你的地址。地址只不过公钥的Keccak-256哈希,本节并未给出公钥的格式样例。

私钥的格式样例如下:

aa50f1a46ecb19a2464cfdd43f0d31ad32f4bb598df3ed5a448a43ab5d02f0ef

通过这个密钥,你可以控制上述地址

技术资料补充

助记词短语和BIP39

一些去中心化应用和钱包会使用助记词短语或JSON文件进行账户恢复(例如,MetaMask使用包含12个单词的种子短语来进行账户恢复)。与私钥类似,助记词短语和密钥库文件(通常是JSON文件)应当得到适当保护。

资源:

https://iancoleman.io/bip39/ & https://github.com/iancoleman/bip39

如果有人知道了你的助记词短语或者拿到你的JSON密钥库文件,那么他们可能会恢复你的账户并获得你的资金使用权。

更多信息,请参考MetaMask(https://support.metamask.io/)和MyEtherWallet(https://myetherwallet.github.io/knowledge-base/)的知识库。

非对称密码学入门

以太坊账户是通过复杂且内在安全的非对称加密技术产生的。以太坊账户的创建共分为三个步骤:

首先,随机生成包含64个字符的十六进制私钥。

其次,通过采用该包含64个字符的十六进制私钥,并应用椭圆曲线乘法来生成公钥(这是不可逆的计算)。

最后,获得新生成的公钥的Keccak-256哈希值,并取该哈希的最后,即最右边的40个字符,冠以“0x”前缀,由此得到账户地址。

通过使用我们的账户衍生的非对称私钥和地址,我们就可以开始执行交易。“交易”这一术语是指从外部拥有账户发送的签名数据包。与交易类似,消息调用是由合约而不是外部拥有账户产生的。合约甚至可以再次调用其他合约。在以太坊白皮书的描述中,合约并不是必须履行的对象,它只是区块链上的代码块,当由外部拥有账户或另一个合约(通过消息调用)调用该代码块时执行。

如果我们在两个外部账户之间进行原始交易,那么这个过程非常简单。首先,我们需要三个参数:发送交易的账户、将要接收交易值的账户以及交易值。当然,这里面还需要其他参数:nonce(随机数),gasLimit和gasPrice。然而,我们不需要亲自获取这些值,因为它们将由geth控制台填充。

nonce:这是发送交易的账户的交易数(注意不要与工作量证明的随机数混淆,这是完全不同的随机数)。

gasLimit(STARTGAS):由外部拥有账户支付的预付款,用于设置执行交易的最高价格。如果所有的gas都用完了,那么交易将恢复为之前的状态。通常情况下,未花费的gas会被返还给交易发送方。

gasPrice(GASPRICE):外部拥有账户为执行交易而支付的每一个计算步骤(EVM操作码)的价值。

使用ethereumjs-tx发送交易

在本文中,我们将使用ethereumjs-tx执行交易。其安装步骤十分简单,请使

用以下命令:

接下来,我们不妨运行一个geth控制台并获取一些值,以帮助我们更好地定义交易参数。我们可以使用Rinkeby测试网来进行此练习。你将需要从Rinkeby水龙头@https://faucet.rinkeby.io/获取测试网以太币。

打开终端并输入以下geth命令:

利用第二个终端查看geth的反馈信息

在我们的geth节点中使用以下命令来获取交易随机数:

现在,我们已经获得了交易随机数,我们再加入其他将交易发送到以太坊网络的代码。需要注意的是,了解交易随机数及其如何防止在以太坊区块链上发生双重花费十分重要。假设账户A向账户B发送3个以太币,并且账户A的账户中仅包含3个以太币。账户A签署这笔交易并将其广播到网络。随后,,账户A立马使用更高的gas价格签署并向账户C广播了第二笔花费3以太币的交易。更高的gas价格将使第二笔交易在待打包交易池中排到更高的队列,从而有效地执行了双重花费。

随机数的使用可以防止这种双重花费的发生,因为账户交易需要按序进行。在上述示例中,假设账户的随机数为0,第一笔交易将被写入区块链。即使gas的价格更高,第二笔交易也会被拒绝,因为其随机数比第一笔交易的随机数大1。区块链会认为,即使账户A以更高的gas价格发送交易,账户A也没有足够的以太币来执行第二笔交易,因此拒绝该第二笔交易。

我们的node.js控制台:

上述console.log(rawTxn)命令将返回原始交易字符串。我们可以使用以下命令将这个原始交易字符串输入到geth控制台中:

eth.sendRawTransaction(“0xf86d018520540be400839752e094a18d70840b9bc475ba15f4f6a98d

2967744fe4c1882fe01dba2bb1dffe001ba0984e42f70a04d17e56b965423ae83527ee701cfb56e2b701b8b46e9c94461303a01ffd3efc1bcc7eb5f85fa1929cb2ca52706a59f0c48febe488c3c56aee5d164e”)

在第二个终端中,你会得到类似于以下内容的输出:

INFO [XX-XX|XX:XX:XX] Submittedtransaction ...

总而言之,上述教程展示了如何从外部拥有账户发送交易。最重要的是,我们要了解合约并不能启动交易。合约能够将消息发送给其他合约,但是,在这一步之前,合约必须首先从外部拥有账户接收消息。

合约消息是不同的,它们没有gas上限,因此由外部拥有账户发起交易的费用必须足以完成整个执行过程。如果消息执行耗尽了所有的gas,那么该特定消息将停止并恢复为先前的状态,即解除先前所有的计算步骤,并有效地恢复其先前的状态。我们会说这是一笔不成功的交易。

Since we sent theabove transaction on the Rinkeby testnet, you could simply use Etherscan toview your address, the transactions you’resending and receiving at that address, as well as the externally owned accountsand contracts that received your test ether. Many decentralized apps referenceEtherscan to obtain a quick glimpse of your activity on the blockchain. Take amoment to review: https://etherscan.io

由于我们是通过Rinkeby测试网来发送上述交易的,因此你只需要使用Etherscan即可查看你的地址、在该地址发送和接收的交易以及接收你的测试以太币的外部拥有账户和合约。许多去中心化应用都会参考Etherscan,以快速了解你在区块链上的活动。你可以花点时间在此回顾一下你的区块链交易:https://etherscan.io

其他Web3库

Web3js - JavaScript

Github:

https://github.com/ethereum/web3.js/

Docs:

https://web3js.readthedocs.io/en/1.0/

Web3py - Python

Github:

https://github.com/ethereum/web3.py

Docs:

https://web3py.readthedocs.io/en/stable/

Web3j - Java

Github:

https://github.com/web3j/web3j

Docs:

https://docs.web3j.io/

补充阅读:

以太坊白皮书:

https://github.com/ethereum/wiki/wiki/White-Paper#messages-and-transactions

以太坊黄皮书:

https://ethereum.github.io/yellowpaper/paper.pdf

本文翻译:Jacky

本文校对:Jacky/Vivian

原文作者:Wil

原文链接:

https://kauri.io/ethereum-101-part-4-accounts-transactions-and-me/7e79b6932f8a41a4bcbbd194fd2fcc3a/a

区块链技术网。

  • 发表于 2020-06-26 17:50
  • 阅读 ( 1240 )
  • 学分 ( 3 )
  • 分类:以太坊

评论