以太坊交易会发生什么?以太坊可以被认为是一个基于交易的状态机,其中交易可以改变状态,而状态跟踪交互。在这里,我们在高层次上检查交易的组成部分,并解释如何确定大多数乱码的十六进制值。我们将在本教程中使用nodejs,因此我们首先安装依赖项。$npminstallweb3@0.19ethereumjs-util@4.4ethereumjs-tx@1.3然后创建文件tx.js并引入依赖项。varWeb3=require('web3');varweb3=newWeb3(newWeb3.providers.HttpProvider('https://ropsten.infura.io/'));varutil=require('ethereumjs-util');vartx=require('ethereumjs-tx');首先,我们从私钥开始。以太坊使用公钥密码术进行身份验证。更具体地说,使用了具有secp256k1曲线的椭圆曲线数字签名算法(ECDSA)。除了一些限制之外,私钥只是一段随机的256位数据。例如:varprivateKey='0xc0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0de';导出相关的公钥:varpublicKey=util.bufferToHex(util.privateToPublic(privateKey));如果你打印出publicKey,你应该得到以下内容:0x4643bb6b393ac20a6175c713175734a72517c63d6f73a3ca90a15356f2e967da03d16431441c61ac69aeabb7937d333829d9da50431ff6af38536aa262497b27与该私钥相关联的AnEthereumaddressisthelast160bitsoftheSHA3-256(Keccak)hashofthepublickey.varaddress='0x'+util.bufferToHex(util.sha3(publicKey)).slice(26);//0x53ae893e4b22d707943299a8d0c844df0e3d5557可以看到,多个私钥实际上可能有相同的地址。以太坊账户与每个地址相关联,每个账户都具有以下属性:nonce从0开始计算传出交易的数量。余额中的以太币数量。storageRoot与帐户存储关联的哈希。codeHash管理账户的代码的哈希值,如果为空,则该账户是一个可以使用其私钥访问的普通账户,否则它是一个智能合约,其交互由其代码控制。接下来我们看一个交易,有6个输入字段:nonce是从0开始的传出交易数量的计数。gasPrice价格决定了交易将花费的以太币数量。gasLimit处理交易允许的最大gas。将交易发送到的账户,如果为空,交易将创建合约。估计要发送的以太币价值。数据可以是对合约的任何消息或函数调用或创建合约的代码。发送1000wei(1ether=10的wei的18次方)ether并留下消息0xc0de的交易可以构造如下:varrawTx={nonce:web3.toHex(0),gasPrice:web3.toHex(20000000000),gasLimit:web3.toHex(100000),to:'0x687422eEA2cB73B5d3e242bA5456b782919AFc85',value:web3.toHex(1000),data:'0xc0de'};注意senderfromaddress是没有指定的,是用私钥签名后从签名中推导出来的。签署交易:varp=newBuffer('c0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0dec0de','hex');vartransaction=newtx(rawTx);交易.sign(p);然后可以将交易发送到网络并通过256位交易ID进行跟踪。此交易可在Etherscan上查看。交易ID是交易的哈希值。console.log(util.bufferToHex(transaction.hash(true)));//0x8b69a0ca303305a92d8d028704d65e4942b7ccc9a99917c8c9e940c9d57a9662Next,let'slookatthedatacompositionofthefunctioncall.以此交易的数据为例:console.log(web3.eth.getTransaction('0xaf4a217f6cc6f8c79530203372f3fbec160da83d1abe048625a390ba1705dd57').input);//0xa9059cbb0000000000000000000000007adee867ea91533879d083dd47ea81f0eee3a37e000000000000000000000000000000000000000000000000d02ab486cedbffff为了知道它正在调用哪个函数,必须事先知道合约的函数以创建哈希表。Thefirst32bitsofa9059cbbarethefirst32bitsofthefunctionhash.Inthiscasethefunctionistransfer(address_to,uint256_value)anditshashis:console.log(web3.sha3('transfer(address,uint256)'));//0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049bfollowedbyeachparameter256bits,sointhiscase,theaddressis:0x00000000000000000000000000007adee867EA91533879d083dd47EA81F0EE3A37Eandnon-symbolicintegers:0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000omittedTO,thesummaryoftheTOofTO,omittedbytheprovisionalistTar,omittedtheomissions.Buthowistheaddressofthecontractdetermined?以此交易为例:console.log(web3.eth.getTransactionReceipt('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5').contractAddress);//0x950041c1599529a9f64cf2be59ffb86072f00111合约地址是发件人地址的最后160位hash,其nonce可以预先确定。对于此交易,可以通过以下方式找到发件人和nonce`:varcontractTx=web3.eth.getTransaction('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5');console.log(contractTx.from);//0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6fconsole.log(contractTx.nonce);//0Sothecontractaddressis:console.log('0x'+util.bufferToHex(util.rlphash(['0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f',0])).slice(26));//0x950041c1599529a9f64cf2be572ffb8Iunderstandalittleaboutthesystem!Ethereumandsmartcontractshavehugepotentialtodisruptmanyindustries.网上有很多资源,您可以在下面找到其中的一些资源以继续探索以太坊!以太坊主站:https://www.ethereum.org/Mist以太坊的客户之一:https://github.com/ethereum/m...Solidity:http://solidity.readthedocs.i...。Web3api:https://github.com/ethereum/w...社区讨论:https://www.reddit.com/r/ethe...=======================================================================分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:java以太坊开发教程,主要针对Java和android程序员开发区块链以太坊web3j详解。PythonEthereum,主要供python工程师使用web3.py详细开发区块链以太坊。PHPEthereum主要介绍使用PHP进行智能合约开发交互、账户创建、交易、转账、代币开发、过滤器和交易等。以太坊入门教程,主要介绍智能合约和dapp应用开发,适合入门。以太坊开发进阶教程,主要介绍使用node.js、mongodb、blockchain、ipfs实现去中心化电商DApp实战,适合进阶。C#以太坊主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器与交易等EOS教程,本课程帮助您快速上手开发EOS区块链去中心化应用,涵盖EOS工具链、账户钱包、发行代币、智能合约开发部署、使用代码与智能合约交互等核心知识点,最终利用所有知识点完成一个笔记DApp的开发.Java比特币开发教程,本课程面向初学者,内容涵盖了比特币的核心概念,如区块链存储、去中心化共识机制、密钥和脚本、交易和UTXO等,还详细讲解了如何使用JavaIntegrating比特币在代码中的支持功能,如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习教程。Php比特币开发教程,本课程面向初学者,内容涵盖了比特币的核心概念,如区块链存储、去中心化共识机制、密钥和脚本、交易和UTXO等,同时还详细讲解了如何使用PhpIntegrating比特币在代码中的支持功能,如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习教程。tendermint区块链开发详解。本课程适合想要使用tendermint进行区块链开发的工程师。课程内容包含了tendermint应用开发模型中的核心概念,如ABCI接口、Merkle树、多版本状态库等,包含了丰富的代币发行等实用代码,是go语言工程师快速上手的最佳选择开始区块链开发。汇智网原创翻译,转载请注明出处。这里是原文WhathappensinEthereumtransactions?
