經過node.js看看在以太坊交易中都發生了什麼?

在以太坊交易中都發生了什麼?以太坊能夠被認爲是基於交易的狀態機,其中交易能夠改變狀態,而且狀態跟蹤交互。在這裏,咱們從高層次上檢查交易的組成部分,並解釋大多數亂碼十六進制值是如何肯定的。php

咱們將在本教程中使用nodejs,所以咱們首先安裝依賴項。java

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

而後建立一個文件tx.js並要求依賴項。node

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位數據。例如:python

var privateKey = '0xc0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0de';

導出相應的公鑰:android

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

若是你打印出publicKey,你應該獲得如下內容:git

0x4643bb6b393ac20a6175c713175734a72517c63d6f73a3ca90a15356f2e967da03d16431441c61ac69aeabb7937d333829d9da50431ff6af38536aa262497b27

與該私鑰相關聯的以太坊地址是公鑰的SHA3-256(Keccak)哈希的最後160位。程序員

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

正如你所看到的,實際上多個私鑰可能具備相同的地址。以太坊賬戶與每一個地址相關聯,而且每一個賬戶都具備如下屬性:github

  • nonce從0開始的傳出交易數的計數。
  • balance中的以太幣數量。
  • storageRoot與賬戶存儲關聯的哈希。
  • codeHash管理賬戶的代碼的哈希,若是這是空的,那麼該賬戶是可使用其私鑰訪問的普通賬戶,不然它是一個智能合約,其交互由其代碼管理。

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

  • 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

如今咱們已經對這些十六進制瞭解了一點!

以太坊和智能合約具備破壞許多行業的巨大潛力。網上有不少資源,你能夠在下面找到一些資源繼續探索以太坊!

以太坊主站點:https://www.ethereum.org/
Mist以太坊的客戶端之一:https://github.com/ethereum/m...
Solidity:http://solidity.readthedocs.i...
Web3 api:https://github.com/ethereum/w...
社區討論:https://www.reddit.com/r/ethe...

======================================================================

分享一些以太坊、EOS、比特幣等區塊鏈相關的交互式在線編程實戰教程:

  • java以太坊開發教程,主要是針對java和android程序員進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智能合約開發交互,進行帳號建立、交易、轉帳、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智能合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括帳戶管理、狀態與交易、智能合約開發與交互、過濾器和交易等。
  • EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、帳戶與錢包、發行代幣、智能合約開發與部署、使用代碼與智能合約交互等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • tendermint區塊鏈開發詳解,本課程適合但願使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操代碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。

匯智網原創翻譯,轉載請標明出處。這裏是原文在以太坊交易中都發生了什麼?

相關文章
相關標籤/搜索