怎么查询以太坊买卖细节
学习怎么运用eth_getTransactionReceipt
办法获取买卖的常规信息。
简介
当您在 Etherscan 上检查买卖时,您可以取得如下图所示的买卖的一般信息:
可是,假如您想在您的应用程序中以编程方法获取此信息,该怎么办?您可以向您应用程序的用户显现这些细节,以向他们供给有关该买卖的更多信息。
关于本教程
咱们将运用node.js
编写一个简略的脚本,经过买卖哈希获取买卖的一般概况。咱们将运用Alchemy的getTransactionReceipt API获取买卖的收据。买卖收据包含买卖的一般信息。
编写脚本
过程1:装置Node和NPM
假如您还没有装置,请在您的本地核算机上装置Node和NPM。
经过在终端中键入以下内容保证Node至少为v14或更高版别:
node -v
过程2:创立Alchemy应用程序
假如你还没有,请注册一个免费的Alchemy账户。
接下来,导航到Alchemy 仪表板 并创立一个新应用程序。
保证将链设置为以太坊,网络设置为 Mainnet。
创立应用程序后,单击仪表板上的您的应用程序的“查看密钥”按钮。
注意HTTP URL。
URL 将选用此方法:https://eth-mainnet.g.alchemy.com/v2/xxxxxxxxx
稍后您将需求此 URL。
过程3:创立一个Node项目
现在让咱们创立一个空的库房并装置一切的Node依靠。
为了宣布恳求,咱们将运用Alchemy SDK。
您也可以选择运用ethers
或cURL
。
- Alchemy SDK
mkdir my-project && cd my-project
npm init -y
npm install --save alchemy-sdk
touch main.js
- ethers
mkdir my-project && cd my-project
npm init -y
npm install --save ethers
touch main.js
这将创立一个名为my-project
的库房,其间包含您的一切文件和依靠项。
接下来,在您喜欢的代码编辑器中打开此库房。
咱们将在main.js
文件中编写一切代码。
过程4:获取买卖收据
为了取得买卖收据,咱们将运用getTransactionReceipt办法,该办法将字符串买卖哈希作为参数。
将以下代码添加到main.js
文件中。
- Alchemy SDK
const { Network, Alchemy } = require("alchemy-sdk");
// Optional config object, but defaults to demo api-key and eth-mainnet.
const settings = {
apiKey: "<-- ALCHEMY API KEY -->", // Replace with your Alchemy API Key.
network: Network.ETH_MAINNET, // Replace with your network.
};
const alchemy = new Alchemy(settings);
alchemy.core
.getTransactionReceipt(
"0x68ea69fd8b5dfa589a7a983c324ab153a33356320207885a9bba84425598dcaa" // Transaction hash of the transaction for which you want to get information.
)
.then(console.log);
- ethers
const ethers = require("ethers");
(async () => {
const provider = new ethers.providers.JsonRpcProvider("https://eth-mainnet.g.alchemy.com/v2/your-api-key");
const txReceipt = await provider.waitForTransaction(
"0x68ea69fd8b5dfa589a7a983c324ab153a33356320207885a9bba84425598dcaa" // Transaction hash of the transaction for which you want to get the information
);
console.log(txReceipt);
})();
要宣布恳求,请运用以下命令运行脚本或运用 cURL
宣布恳求:
- JavaScript
node main.js
- cURL
curl https://eth-mainnet.g.alchemy.com/v2/your-api-key \
-X POST \
-H "Content-Type: application/json" \
--data '{"method":"eth_getTransactionReceipt","params":["0x68ea69fd8b5dfa589a7a983c324ab153a33356320207885a9bba84425598dcaa"],"id":1,"jsonrpc":"2.0"}'
假如一切顺利,您应该看到相似于这样的输出:
{
to: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
from: '0xe5cB067E90D5Cd1F8052B83562Ae670bA4A211a8',
contractAddress: null,
transactionIndex: 86,
gasUsed: BigNumber { _hex: '0xe429', _isBigNumber: true },
logsBloom: '0x00000000000000000000001000000000000000000000000000000000000000000000000000000000000200000000010000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000200000000000000100000000000000000000000000080000000100000000000000000000000000000000000000002000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
blockHash: '0x2b9055d24eaeda177211e3b0f183c3b21c2f425d32d8fa7b710df0c63a89a558',
transactionHash: '0x68ea69fd8b5dfa589a7a983c324ab153a33356320207885a9bba84425598dcaa',
logs: [
{
transactionIndex: 86,
blockNumber: 15802409,
transactionHash: '0x68ea69fd8b5dfa589a7a983c324ab153a33356320207885a9bba84425598dcaa',
address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
topics: [Array],
data: '0x000000000000000000000000000000000000000000000000000000001101bd29',
logIndex: 127,
blockHash: '0x2b9055d24eaeda177211e3b0f183c3b21c2f425d32d8fa7b710df0c63a89a558'
}
],
blockNumber: 15802409,
confirmations: 209486,
cumulativeGasUsed: BigNumber { _hex: '0x5f17f5', _isBigNumber: true },
effectiveGasPrice: BigNumber { _hex: '0x0425f51bc5', _isBigNumber: true },
}
输出字段如下:
-
transactionHash
– 买卖哈希。 -
transactionIndex
– 买卖在块中的索引方位,编码为十六进制。 -
from
– 发送者地址。 -
to
– 接收者地址。当为合约创立买卖时为 null。 -
blockHash
– 买卖地点块的哈希。 -
blockNumber
– 买卖添加到的块的块号,编码为十六进制。 -
cumulativeGasUsed
– 在块中履行此买卖时运用的总燃料。 -
effectiveGasPrice
– 买卖时的每个燃料价格。 -
gasUsed
– 仅此特定买卖运用的燃料量。 -
contractAddress
– 用于合约创立的合约地址,否则为 null。 -
logs
– 此买卖生成的日志目标数组。 -
logsBloom
– 用于轻客户端快速检索相关日志的布隆过滤器。 -
value
– 以十六进制编码的 Wei 搬运的价值。
恭喜!您现在知道怎么以编程方法获取有关买卖的一般信息。
理解以太坊上的买卖目标
本指南具体介绍了eth_getTransactionByHash回来的Transaction目标呼应中的每个元素。
买卖目标
以太坊上的买卖目标由以下组成:
-
blockHash
:DATA
,32字节 – 买卖地点区块的哈希值。当买卖待处理时为null。 -
blockNumber
:QUANTITY
– 买卖地点区块的块号。当买卖待处理时为null。 -
from
:DATA
,20字节 – 发送者地址。 -
gas
:QUANTITY
– 发送者供给的gas。 -
gasPrice
:QUANTITY
– 发送者供给的gas价格,以Wei为单位。 -
hash
:DATA
,32字节 – 买卖的哈希值。 -
input
:DATA
– 与买卖一同发送的数据。 -
nonce
:QUANTITY
– 发送者在此之前宣布的买卖数量。 -
to
:DATA
,20字节 – 接收者地址。当买卖是合约创立买卖时为null。 -
transactionIndex
:QUANTITY
– 买卖在区块中的方位。当买卖待处理时为null。 -
value
:QUANTITY
– 以Wei为单位的搬运金额。 -
v
:QUANTITY
– ECDSA恢复ID -
r
:DATA
,32字节 – ECDSA签名r -
s
:DATA
,32字节 – ECDSA签名s
以下是买卖目标中每个参数的更具体说明。
hash
每个已验证并添加到区块链中的买卖都会收到分配的哈希值
。这为买卖创立了一个唯一标识符,可用于定位和检索有关特定买卖的信息。
blockHash
每个区块都有一个相应的加密哈希值,其间包含该区块的一切数据。blockHash
是包含此买卖的区块的哈希值。关于未添加到区块的待处理买卖,您将收到一个null值。
blockNumber
一旦区块添加到区块链中,它就会按顺序分配以下可用编号。运用blockNumber
,可以确认买卖何时已添加到区块中。
from
以太坊买卖具有发送方和接收方。from
字段是发送方的地址,可用于查找发动买卖的地址。
gas
为使买卖完结并添加到区块中,发送方必须供给额定的gas量以及买卖的价值。Gas用于掩盖完结买卖所需的核算成本。此gas
字段显现了发送方供给的gas量。
gasPrice
另一种显现gas价格的办法是以Wei为单位。 Wei是ETH的最小面额,是处理小额ETH买卖的更好方法。 1 wei等于10 ^ -18 ETH。此gasPrice
显现发送方以WEI供给的gas量。
input
在用户布置或调用智能合约中的函数时,可以将数据添加到买卖的数据字段中。此数据是指向将被履行的函数的智能合约的音讯。
input
字段包含包含在买卖中的数据。假如此字段为空,则买卖是用户之间的搬运,并且不触及智能合约。
nonce
为避免用户重复消费并保证买卖按正确顺序产生,来自给定地址的每个买卖都有一个分配的nonce
。nonce是该特定地址的买卖数量。每次买卖后,nonce添加1。必须完结一笔买卖才干开端另一笔买卖。
to
买卖具有发送方和接收方。to
字段是接收方的地址,可用于查找发动买卖的地址。
transactionIndex
当买卖添加到区块中时,它被分配为该块内的编号方位。transactionIndex
回来已添加到其间的块的买卖的方位的值。
value
每个买卖都有一个附加的值,这是从发送方传输到接收方的金额。value
回来此数量,并以Wei显现。
r,s
以太坊运用ECDSA(椭圆曲线数字签名算法)创立买卖的数字签名。这些签名用于验证它们是实在的并来自正确的发送方,就像实在的签名一样。
数字签名可以分为两个数字 – r
和s
。这些数字由您的私钥生成。经过将s
发送到算法,应该取得用于验证签名的R
的值。
v
ECDSA在验证买卖签名时运用v
值来恢复正确的公钥。它是以下两个值的组合:
- recovery_id – ECDSA用于生成密钥的曲线上的方位。
- chain_id – 以太坊网络ID(例如:1-以太坊主网)。
什么是内部买卖?
这是关于以太坊内部买卖的深入指南,以及怎么运用Alchemy Transfers API检索它们。
内部买卖是智能合约之间产生的买卖。这也包含从智能合约向用户发送ETH时的买卖到外部地址。这些买卖被标记为内部买卖,因为以太坊区块链上布置的每个智能合约都有一个指定的内部地址。
另一方面,代币搬运是产生在用户创立的外部地址之间的另一种买卖。这种买卖的一个例子是代币搬运,比方一个用户向另一个用户发送ERC-20代币。
当外部地址调用智能合约履行操作时,将触发内部买卖。合约将运用其内置逻辑开端与完结操作所需的其他合约进行交互。即使在单个买卖中,智能合约或许需求履行多个对其他合约的内部调用。
内部买卖示例
这种买卖流程的典型示例是运用代币交流。
- 代币搬运 – 用户经过向交流的智能合约发送其代币来开端ERC-20代币的交流。
- 代币搬运 – 买卖所的智能合约随后将代币存入连接到流动性池的智能合约中。
- 内部买卖 – 买卖所的合约收到以WETH(包装的以太坊)兑换的金额,然后将该金额发送到WETH智能合约以转换为ETH。
- 内部买卖 – 买卖所的合约将此ETH发送到用户的外部地址以完结交流。
用例
内部买卖可以为用户供给一些重要信息。以下是一些dApp中可以运用内部买卖信息的用例:
- 失利买卖告诉 – 假如内部买卖失利,整个买卖将失利。告诉用户毛病点的确切方位有助于解决问题。
- 智能合约监控 – 您的布置的智能合约可以经过内部买卖与其他合约交互。为了知道它与哪些合约交互以及何时交互,您可以监视您的智能合约地址以获取任何内部买卖。
- 区块链分析 – 因为内部买卖可以很杂乱,因此获取见地是有帮助的。经过查看智能合约履行的内部买卖数量,您可以了解该合约的受欢迎程度和功能。
- 批量买卖 – 假如您向不同的发送者地址发送一批买卖,则可以运用内部买卖更方便且更安全地保证它们到达正确的地址。
盯梢内部买卖
在内部买卖中找到的信息可以指导和告知用户有关其买卖的状况。内部买卖的扎手之处在于它们不存储在链上,并且没有像外部买卖那样的加密签名。这使得它们更难以盯梢,并需求额定的资源,如存档节点。
走运的是,您可以运用Alchemy转账API找到内部买卖可用的信息,而无需进行任何额定的设置。
要获取内部买卖信息,请将category
设置为internal
,如下例所示:
{
"jsonrpc": "2.0",
"id": 0,
"method": "alchemy_getAssetTransfers",
"params": [
{
"fromBlock": "0xA97AB8",
"toBlock": "0xA97CAC",
"maxCount": "0x5",
"excludeZeroValue": true,
"category": [
"internal"
]
}
]
}
有关格式化您的恳求和呼应的更多信息,请查看Transfers API。
怎么处理校验和地址
了解以太坊中的校验和地址是什么,它们为什么存在以及怎么运用ethers库处理它们。
在与以太坊和相似的Web3环境一同作业时,较不友好的一个方面是运用40个字符的十六进制字符串代表区块链上的钱包(或帐户)。
以太坊的创立者从未想过运用十六进制字符串来辨认区块链上的实体。相反,他们期望像ENS这样的体系成为用户可读称号的标准,例如vitalik.eth。
尽管ENS称号日益遍及并得到支持,但事实仍然是绝大多数用户继续运用十六进制地址在公共区块链上进行买卖。
记住和输入地址的杂乱性以及Web3买卖的不可逆性导致了校验和地址的创立,作为对人为过错的适度毛病安全机制。
在本短教程中,咱们将介绍校验和地址的含义、作业原理以及怎么运用ethers库处理它们。
什么是校验和地址?
正如您或许现已知道的那样,以太坊地址表明为40个字符的十六进制字符串。校验和地址是以太坊地址的一种特殊版别,它添加了一定的大小写敏感性。
假如您在相似MetaMask的钱包上检查您的钱包地址,您会发现有些字母是大写的,而有些则不是。这是校验和验证在起作用,以此特定的方法大写某些字母,以避免用户过错地进行无法吊销的买卖。
核算地址的校验和相当简略。
1.将原始以太坊地址转换为小写。 2.核算小写地址的SHA-3哈希值。 3.取哈希值的前40个字符(它是一个64个字符的十六进制字符串),并替换原始小写地址中的相应字符。假如哈希中的字符是字母(A-F),则地址中的相应字符应为大写。假如哈希中的字符是数字(0-9),则地址中的相应字符应坚持小写。 4.最终结果是地址的校验和版别。
运用ethers处理校验和地址
走运的是,咱们不需求手动履行上述过程。 ethers库供给了一个非常方便的函数,将一切小写的钱包地址转换为其带校验和的版别。 它还答应咱们检测校验和无效的地址。
以下是一个演示上述两个功能的节点脚本:
const ethers = require('ethers');
// All lowercase address
const address = '0xc361fc33b99f88612257ac8cc2d852a5cee0e217'
// Convert to checksum version
let checksum = ethers.utils.getAddress(address)
console.log("Checksum address:", checksum)
// Invalid checksum
const invalid = "0xc361fc33b99F88612257ac8cc2D852A5CEe0E217"
checksum = ethers.utils.getAddress(invalid);
运行此脚本后,您应该看到相似于此的输出:
Checksum address: 0xc361Fc33b99F88612257ac8cC2d852A5CEe0E217
/Users/rounakbanik/alchemy-tut/nft-collection/node_modules/@ethersproject/logger/lib/index.js:247
throw this.makeError(message, code, params);
^
Error: bad address checksum (argument="address", value="0xc361fc33b99F88612257ac8cc2D852A5CEe0E217", code=INVALID_ARGUMENT, version=address/5.7.0)
at Logger.makeError (/Users/rounakbanik/alchemy-tut/nft-collection/node_modules/@ethersproject/logger/lib/index.js:238:21)
at Logger.throwError (/Users/rounakbanik/alchemy-tut/nft-collection/node_modules/@ethersproject/logger/lib/index.js:247:20)
at Logger.throwArgumentError (/Users/rounakbanik/alchemy-tut/nft-collection/node_modules/@ethersproject/logger/lib/index.js:250:21)
at Object.getAddress (/Users/rounakbanik/alchemy-tut/nft-collection/node_modules/@ethersproject/address/lib/index.js:80:20)
at Object.<anonymous> (/Users/rounakbanik/alchemy-tut/nft-collection/checksum.js:12:25)
at Module._compile (internal/modules/cjs/loader.js:1068:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
at Module.load (internal/modules/cjs/loader.js:933:32)
at Function.Module._load (internal/modules/cjs/loader.js:774:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12) {
reason: 'bad address checksum',
code: 'INVALID_ARGUMENT',
argument: 'address',
value: '0xc361fc33b99F88612257ac8cc2D852A5CEe0E217'
}
正如预期的那样,以太币可以为咱们供给一个一切字母小写的地址的校验和版别,并正确地辨认出具有无效校验和的地址。
定论
围绕以太坊钱包和钱包地址的用户体验仍然有很大的提高空间。尽管像 ENS 这样的解决方案很快赶上了,但大多数在区块链上进行的买卖仍运用十六进制地址。
尽管激烈建议您复制粘贴钱包地址,永远不要手动输入它们,但像校验和这样的解决方案使咱们可以具有一个毛病保护,避免触及过错输入地址的不可逆转买卖的产生。