在以太坊交易中都發生了什麼?以太坊能夠被認爲是基於交易的狀態機,其中交易能夠改變狀態,而且狀態跟蹤交互。在這裏,咱們從高層次上檢查交易的組成部分,並解釋大多數亂碼十六進制值是如何肯定的。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語言工程師快速入門區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裏是原文在以太坊交易中都發生了什麼?