程序员分享区块链

从0了解区块链-了解以太坊账号、交易、信息

2021-02-23  本文已影响0人  文博客

继续更新区块链-以太坊的文章,话不多少直接开整。

本文翻译至:https://github.com/kauri-io/archive/tree/main/docs/collections/Ethereum%20101

账号、交易和信息

以太坊状态由账户组成,这些账户之间的交易推动了网络向前发展,确保网络验证者对其工作证明计算的安全补偿得到适当的补偿,以保护区块链

区块链是一种状态转换系统。“状态”是所有现有以太坊账户,智能合约和以太币所有权的分类帐。在“状态转换函数”中,该状态用于执行事务,并且该事务的输出变为新状态。当交易由外部账户提交到网络时,它们将以太坊区块链移动到最新状态。

快速总览

这里有两个不同类型的账户:

外部拥有的帐户由其私钥控制,而合同帐户则由其合同EVM字节码控制,这一主题将在另一部分中讨论。

地址(请勿汇款至该地址,否则可能会丢失):
0xab6291d3B3290e7F2287dE751Fb5FDDA4B91ebB6

该地址是您帐户的面向公众的元素。 如果您要接收以太币,则应将该交易定向到该地址。 该地址只是公共密钥的Keccak-256哈希,在本节中未列出。

私钥(使用此密钥,您可以控制上述地址):
aa50f1a46ecb19a2464cfdd43f0d31ad32f4bb598df3ed5a448a43ab5d02f0ef

补充技术资料

助记词短语和BIP39

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

资源:

如果有人知道了您的助记词短语或获取您的JSON密钥库文件,则他们可能能够恢复您的帐户并获得您的资金使用权。 有关更多信息,请参考MetaMask (https://support.metamask.io/)和MyEtherWallet(https://myetherwallet.github.io/knowledge-base/).

非对称加密入门

帐户是通过复杂且本质上安全的非对称加密技术得出的。 以太坊账户的创建分为三个步骤:

使用我们账户派生的非对称私钥和地址,我们可以开始执行交易。术语transaction指的是由外部拥有的账户发送的签名数据包。与交易类似,消息调用是由合约产生的,而不是外部拥有的账户。合约甚至可以对其他合约进行消息调用。白皮书将合约描述为不是必须履行的对象,而是区块链上的代码块,当被外部拥有的账户或另一个合约(通过消息调用)调用时就会被执行。

在我们在两个外部账户之间进行原始交易的情况下,过程很简单。首先,我们需要三个参数:发送交易的账户,将接收交易值的账户,以及交易值。还需要额外的参数:nonce、gasLimit和gasPrice,不过我们不需要自己推导这些值,因为它们会由geth控制台填充。

使用ethereumjs-tx发送交易

在本文档中,我们将使用ethereumjs-tx来执行这个交易。安装很简单,请使用下面的命令。

$ npm install ethereumjs-tx

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

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

> geth --fast --cache=1024 --rinkeby console 2>>eth.log

使用第二个终端来查看geth提要:

> tail -F eth.log

在我们的geth节点中使用下面的命令来获取我们的交易nonce。

> web3.eth.getTransactionCount(“<insert account here>”)

现在我们已经找到了我们的交易nonce,让我们组装代码,将我们的交易推送到Ethereum网络上。了解交易nonce以及它如何防止Ethereum区块链上的双重支出是很重要的。假设一个账户A要向账户B发送3个ether,而账户A的账户中只有这3个ether。账户A签署并向网络广播这笔交易。随后,在使用更高的gas价格时,A账户又签署并广播了第二笔交易给C,金额为3ether。较高的gas价格使第二笔交易在挂起的交易池中排了较高的队列,有效地执行了一次双重消费。

nonce是防止这种双重消费发生的原因,因为账户交易需要有顺序。在我们上面的例子中,假设账户的nonce为0,第一笔交易将被写入区块链。第二笔交易,即使有更高的gas价格,也会被拒绝,因为nonce比第一笔交易的nonce+1。区块链将解释为,账户A将没有足够的ether来执行第二笔交易,即使发送的是更高的gas价格,然后将拒绝该第二笔交易。

在我们nodejs的控制台中:

> const EthTxn = require(“ethereumjs-tx”)
> const privKey = Buffer.from(“<INSERT PRIVATE KEY>”, “hex”)
> const txnParams = {nonce: “0x00”, gasPrice: “0x2540be400”, gasLimit: “0x222e0”, to: “<INSERT DESTINATION ADDRESS HERE>”, value: “0x2fe01dba2bb1dffe”, data: “0x00”, }
> const tx = new EthTxn(txnParams)
> tx.sign(privKey)
> const serializedTx = tx.serialize()
> const rawTxn = “0x” + serializedTx.toString(“hex”);
> console.log(rawTxn)
// this will output a long transaction string
0xf86d018520540be400839752e094a18d70840b9bc475ba15f4f6a98d2967744fe4c1882fe01dba2bb1dffe001ba0984e42f70a04d17e56b965423ae83527ee701cfb56e2b701b8b46e9c94461303a01ffd3efc1bcc7eb5f85fa1929cb2ca52706a59f0c48febe488c3c56aee5d164e

上面的 console.log(rawTxn) 命令将返回一个原始的交易字符串。使用下面的命令将这个原始交易字符串输入到你的geth控制台:

> eth.sendRawTransaction(“0xf86d018520540be400839752e094a18d70840b9bc475ba15f4f6a98d 2967744fe4c1882fe01dba2bb1dffe001ba0984e42f70a04d17e56b965423ae83527ee701cfb56e2b701b8b46e9c94461303a01ffd3efc1bcc7eb5f85fa1929cb2ca52706a59f0c48febe488c3c56aee5d164e”)

在你的第二个终端,你会发现类似于下面的输出:

INFO [XX-XX|XX:XX:XX] Submitted transaction ...

综上所述,以上教程介绍了如何从外部拥有的账户发送交易。重要的是要明白,合约不会发起交易。合约能够向其他合约发送消息,但要做到这一点,合约必须从外部拥有的账户接收消息。

合约消息则不同,它们没有gas限制,因为发起交易的外部自有账户设定的gas成本必须足够将整个执行过程进行到底。如果一个消息执行耗尽了gas,那么该特定消息将停止并恢复到之前的状态,解除之前所有的计算步骤,有效地恢复之前的状态。这就是一个不成功的交易。

由于我们在Rinkeby testnet上发送了上述交易,你可以简单地使用Etherscan来查看你的地址,你在该地址发送和接收的交易,以及收到你的测试ether的外部拥有的账户和合约。许多去中心化的应用都会参考以太坊来快速获取你在区块链上的活动情况。花点时间来回顾一下:https://etherscan.io

其他Web3库

Web3js - JavaScript

Web3py - Python

Web3j - Java

其他阅读:

上一篇 下一篇

猜你喜欢

热点阅读