您好,登錄后才能下訂單哦!
本篇內容介紹了“以太坊交易中會發生什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
以太坊可以被認為是基于交易的狀態機,其中交易可以改變狀態,并且狀態跟蹤交互。在這里,我們從高層次上檢查交易的組成部分,并解釋大多數亂碼十六進制值是如何確定的。
我們將在本教程中使用nodejs
,因此我們首先安裝依賴項。
$ npm install web3@0.19 ethereumjs-util@4.4 ethereumjs-tx@1.3
然后創建一個文件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
與該私鑰相關聯的以太坊地址是公鑰的SHA3-256(Keccak)哈希的最后160位。
var address = '0x' + util.bufferToHex(util.sha3(publicKey)).slice(26); //0x53ae893e4b22d707943299a8d0c844df0e3d5557
正如你所看到的,實際上多個私鑰可能具有相同的地址。以太坊帳戶與每個地址相關聯,并且每個帳戶都具有以下屬性:
nonce
從0開始的傳出交易數的計數。
balance
中的以太幣數量。
storageRoot
與帳戶存儲關聯的哈希。
codeHash
管理帳戶的代碼的哈希,如果這是空的,那么該帳戶是可以使用其私鑰訪問的普通帳戶,否則它是一個智能合約,其交互由其代碼管理。
接下來我們來看一個交易,有6個輸入字段:
nonce
從0開始的傳出交易數的計數。
gasPrice
價格確定交易將花費的以太量。
gasLimit
允許用于處理交易的最大gas。
to
交易發送到的帳戶,如果為空,交易將創建合約。
估計要發送的以太網的value
。
data
可以是對合約或代碼的任意消息或函數調用以創建合約。
發送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' };
請注意,未指定發件人from
地址,使用私鑰簽名后將從簽名派生。簽署交易:
var p = new Buffer('c0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0de', 'hex'); var transaction = new tx(rawTx); transaction.sign(p);
然后可以將交易發送到網絡,并由256位交易id跟蹤。此交易可在Etherscan查看。交易id是交易的哈希。
console.log(util.bufferToHex(transaction.hash(true))); //0x8b69a0ca303305a92d8d028704d65e4942b7ccc9a99917c8c9e940c9d57a9662
接下來,我們來看一下函數調用的數據data
組成。以此交易的數據為例:
console.log(web3.eth.getTransaction('0xaf4a217f6cc6f8c79530203372f3fbec160da83d1abe048625a390ba1705dd57').input); //0xa9059cbb0000000000000000000000007adee867ea91533879d083dd47ea81f0eee3a37e000000000000000000000000000000000000000000000000d02ab486cedbffff
為了知道它正在調用哪個函數,必須事先知道合約的函數以創建哈希表。第一個32位a9059cbb
是函數哈希的第一個32位。在這種情況下,函數是transfer(address _to,uint256 _value)
,其哈希值是:
console.log(web3.sha3('transfer(address,uint256)')); //0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b
每個參數后面跟256位,所以在這種情況下地址是:
0x0000000000000000000000007adee867ea91533879d083dd47ea81f0eee3a37e
和無符號整數是:
0x000000000000000000000000000000000000000000000000d02ab486cedbffff
接下來,如上所述,通過省略to
字段,將創建合約。但合約的地址是如何確定的?以此交易為例:
console.log(web3.eth.getTransactionReceipt('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5').contractAddress); //0x950041c1599529a9f64cf2be59ffb86072f00111
合約地址是發件人地址的最后160位hash,其nonce
可以預先確定。對于此交易,可以通過以下方式找到發件人和`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
“以太坊交易中會發生什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。