溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

以太坊交易中會發(fā)生什么

發(fā)布時間:2022-01-15 14:18:51 來源:億速云 閱讀:116 作者:iii 欄目:互聯(lián)網科技

本篇內容介紹了“以太坊交易中會發(fā)生什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

以太坊可以被認為是基于交易的狀態(tài)機,其中交易可以改變狀態(tài),并且狀態(tài)跟蹤交互。在這里,我們從高層次上檢查交易的組成部分,并解釋大多數亂碼十六進制值是如何確定的。

我們將在本教程中使用nodejs,因此我們首先安裝依賴項。

$ npm install web3@0.19 ethereumjs-util@4.4 ethereumjs-tx@1.3

然后創(chuàng)建一個文件tx.js并要求依賴項。

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider('https://ropsten.infura.io/'));
var util = require('ethereumjs-util');
var tx = require('ethereumjs-tx');

首先,我們從一個私鑰開始。以太坊使用公鑰加密進行身份驗證。更具體地,使用具有secp256k1曲線的橢圓曲線數字簽名算法(ECDSA)。除了一些限制外,私鑰只是一個隨機的256位數據。例如:

var privateKey = '0xc0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0de';

導出相應的公鑰:

var publicKey = util.bufferToHex(util.privateToPublic(privateKey));

如果你打印出publicKey,你應該得到以下內容:

0x4643bb6b393ac20a6175c713175734a72517c63d6f73a3ca90a15356f2e967da03d16431441c61ac69aeabb7937d333829d9da50431ff6af38536aa262497b27

與該私鑰相關聯(lián)的以太坊地址是公鑰的SHA3-256(Keccak)哈希的最后160位。

var address = '0x' + util.bufferToHex(util.sha3(publicKey)).slice(26);
//0x53ae893e4b22d707943299a8d0c844df0e3d5557

以太坊交易中會發(fā)生什么

正如你所看到的,實際上多個私鑰可能具有相同的地址。以太坊帳戶與每個地址相關聯(lián),并且每個帳戶都具有以下屬性:

  • nonce從0開始的傳出交易數的計數。

  • balance中的以太幣數量。

  • storageRoot與帳戶存儲關聯(lián)的哈希。

  • codeHash管理帳戶的代碼的哈希,如果這是空的,那么該帳戶是可以使用其私鑰訪問的普通帳戶,否則它是一個智能合約,其交互由其代碼管理。

接下來我們來看一個交易,有6個輸入字段:

  • nonce從0開始的傳出交易數的計數。

  • gasPrice價格確定交易將花費的以太量。

  • gasLimit允許用于處理交易的最大gas。

  • to交易發(fā)送到的帳戶,如果為空,交易將創(chuàng)建合約。

  • 估計要發(fā)送的以太網的value。

  • data可以是對合約或代碼的任意消息或函數調用以創(chuàng)建合約。

發(fā)送1000wei(1ether =10的18次方wei)的ether并留下0xc0de消息的交易可以構造如下:

var rawTx = {
    nonce: web3.toHex(0),
    gasPrice: web3.toHex(20000000000),
    gasLimit: web3.toHex(100000),
    to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85',
    value: web3.toHex(1000),
    data: '0xc0de'
};

請注意,未指定發(fā)件人from地址,使用私鑰簽名后將從簽名派生。簽署交易:

var p = new Buffer('c0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0de', 'hex');
var transaction = new tx(rawTx);
transaction.sign(p);

以太坊交易中會發(fā)生什么

然后可以將交易發(fā)送到網絡,并由256位交易id跟蹤。此交易可在Etherscan查看。交易id是交易的哈希。

console.log(util.bufferToHex(transaction.hash(true)));
//0x8b69a0ca303305a92d8d028704d65e4942b7ccc9a99917c8c9e940c9d57a9662

以太坊交易中會發(fā)生什么

接下來,我們來看一下函數調用的數據data組成。以此交易的數據為例:

console.log(web3.eth.getTransaction('0xaf4a217f6cc6f8c79530203372f3fbec160da83d1abe048625a390ba1705dd57').input);
//0xa9059cbb0000000000000000000000007adee867ea91533879d083dd47ea81f0eee3a37e000000000000000000000000000000000000000000000000d02ab486cedbffff

為了知道它正在調用哪個函數,必須事先知道合約的函數以創(chuàng)建哈希表。第一個32位a9059cbb是函數哈希的第一個32位。在這種情況下,函數是transfer(address _to,uint256 _value),其哈希值是:

console.log(web3.sha3('transfer(address,uint256)'));
//0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b

每個參數后面跟256位,所以在這種情況下地址是:

0x0000000000000000000000007adee867ea91533879d083dd47ea81f0eee3a37e

和無符號整數是:

0x000000000000000000000000000000000000000000000000d02ab486cedbffff

以太坊交易中會發(fā)生什么

接下來,如上所述,通過省略to字段,將創(chuàng)建合約。但合約的地址是如何確定的?以此交易為例:

console.log(web3.eth.getTransactionReceipt('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5').contractAddress);
//0x950041c1599529a9f64cf2be59ffb86072f00111

合約地址是發(fā)件人地址的最后160位hash,其nonce可以預先確定。對于此交易,可以通過以下方式找到發(fā)件人和`nonce``:

var contractTx = web3.eth.getTransaction('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5');
console.log(contractTx.from);
//0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f
console.log(contractTx.nonce);
//0

因此合約地址是:

console.log('0x' + util.bufferToHex(util.rlphash(['0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f', 0])).slice(26));
//0x950041c1599529a9f64cf2be59ffb86072f00111

以太坊交易中會發(fā)生什么

“以太坊交易中會發(fā)生什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI