以太坊卡包的付出2 — web3的应用

python利用web3.py开发以太坊应用dapp的实战教程:

以太坊是一个开源的有智能合约功能的公共链平台,它允许任何人在平台中建立和使用通过区块链技术运行的去中心化
应用。

通过本次实战可以快速开发一个完整的去中心化应用-投票系统,用户可以在不可信的分布环境中对特定候选人进行投票,每次的投票记录都会被记录在区块链上

在以太坊的钱包开发1中,我们介绍了node环境搭建、本地区块链节点的搭建与启动,下面开始实现钱包转账。

在以太坊上获得一个基本的智能合约是一个很简单的事,只需google查询“ERC20代币教程”,你会发现有关如何做到这一点的大量信息。以编程方式与合约交互完全是另一回事,如果你是一个Python程序员,那么教程就很少。所以写这个Python中的以太坊智能合约开发指南。

python以太坊

可以简单类比理解,以太坊是Android系统,我们可以应用这个平台基于区块链技术写DAPP应用

去中心化应用(DAPP: Decentrailized Application),应用的运行不
依赖于任何中心化的服务器,而是基于点对点网络上运行,不同的DAPP通常使用不同的数据
结构类型的共识协议,例如比特币使用工作量证明协议(POW)来达成共识。

在app.js中,

按我的统计对我们来说幸运的是,2017年Web3.py的第4版发布,这意味着现在比以往更容易运行python脚本并观察区块链上发生的神奇事情。像幽灵般的。

本课程详细讲解如何使用Python开发以太坊应用,课程内容即涉及以太坊中的核心概念,例如账户管理、状态与交易、智能合约开发与交互、过滤器和事件等,同时也详细说明如何使用Python与以太坊进行交互,是Python工程师学习以太坊应用开发的不二选择

以太坊平台对底层区块链技术进行了封装,让应用开发者可以基于平台进行开发,开发者只需关注应用本身的开发,而无须关注其底层技术,大大降低了开发难度

通过此次实战可以学习到以下知识

var Web3 = require('web3');
if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
} else {
    // set the provider you want from Web3.providers
    web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}

var version = web3.version.api;
console.log(version);

Piper Merriam,Jason
Carver以及其他所有在Web3.py上努力工作以使我们其他人生活更轻松的人大声呼喊,在Sempo,我们正在使用以太坊来使灾难般的响应更加透明,而且它是只有Web3.py才能真正实现。

核心概念

    EVM:以太坊虚拟机,轻量级虚拟机环境,是以太坊中智能合约的运行环境。

    Account:账户,分两类:合约账户存储执行的合约代码;外部账户为以太币拥有者账户,对应到某公钥。

    Transaction:交易,从一个账户到另一个账户的消息,包括以太币或者合约执行参数。

    Gas:燃料,每执行一条合约指令会消耗一定的燃料,当某个交易还未执行结束,而燃料消耗完时,合约执行终止并回滚状态。

以太坊网络中,众多节点彼此链接,构成了以太坊网络

图片 1

2.1 以太坊网络

以太坊节点提供了两个核心功能:交易数据存储、合约代码

在每个以太坊全节点中都保存着完整的数据,不仅有交易的数据,还包括编译后的合约代码,在全节点中还提供一个虚拟机来执行合约代码

    以太坊区块链基础知识

我们实例化了web3的对象,使用这个对象可以实现我们要的所有功能。

设置

首先我们进行设置,确保我们安装了相关的python库。

Python库无处不在,但它们的用途是什么?

有很多与以太坊相关的python库,但是当人们谈论以太坊时,有两个会出现很多:Web3.py和Pyethereum。乍一看,你应该使用哪一个并不明显。

以太坊虚拟机的Python实现。反过来,EVM是以太坊协议的一部分,它实际运行智能合约中的代码并确定其输出。因此,如果你想在Python中运行以太坊节点,那么Pyethereum是一个很好的起点。

即使你非常高兴在不运行自己的节点的情况下运行智能合约,Pyethereum仍然是一个很好的库,它包含许多功能,可以执行有用的功能,例如从私钥计算用户的地址等等。

用于实际与以太坊区块链交互的库。我们谈论的事情包括在账户之间转移以太网,发布智能合约以及触发附加现有智能合约的功能。它受到流行的JavaScript库Web3.js的启发,它将成为我们在本教程中使用的主库。

起初我尝试使用Python3.5版本,但在运行时我遇到了问题,显然是由Python的类型提示造成的。基于Python3.6创建虚拟环境解决了这个问题,所以我建议你做同样的事情。

继续并pip-install web3 。

除非你喜欢花钱,否则你需要在以太坊测试网上使用钱包,例如Ropsten和其他大量以太玩法。一个简单的方法是下载Chrome的Metamask扩展,并从那里创建一个新帐户。

图片 2image

确保你还选择左侧的’Ropsten Test Net’。

即使你的现有钱包中包含真正的以太币,我也强烈建议你为开发目的创建一个新的钱包。我们将使用私钥做一些相对无法预测的事,所以如果它们不小心变成公共主网络的话就不会有问题

为新创建的钱包获取测试Ether非常简单:只需访问faucet.metamask.io并点击“请求来自faucet的1个
以太”。对于我们将要做的事情,这应该是充足的。

最后,因为我们将在没有托管我们自己的节点的情况下使用Ropsten TestNet,我们需要一个可以连接Blockchain的供应商。Infura.io适用于此,所以去那里创建一个免费帐户。记下Ropsten
TestNet的提供者URL(看起来像

交易数据

以太坊中每笔交易都存储在区块链上,当部署合约的时候,一次部署就是一笔交易,这些交易是公开的,每个人都可以看到,这个数据也永远无法篡改

为了确保网络中所有节点都有相同一份拷贝,以太坊目前使用工作量证明(POW:
Proof of
Work)来形成共识,工作量证明不是达成共识的唯一算法,我们目前只需理解
共识是网络中各个节点的数据实现了一致,POW是众多共识算法的一种,这种算法需要矿工来挖矿来实现非可信环境下的一致性。共识是目的,POW是手段。

    开发部署以太坊应用环境

查看余额

部署智能合约

使用Python来部署智能合约而不运行自己的节点是非常困难的,所以我们将在这一步上做点儿手脚。对于许多智能合约用例,你只需要执行一次。

正如我之前提到的,有关如何部署ERC20合约的百万条指南,因此我们将部署一些不同的。

问:谁喜欢在互联网上分享他们的意见?

大家都喜欢?

好答案。以下我称之为“Soap
Box”肥皂盒的智能合约允许任何人向区块链广播他们想要的任何意见,在永恒的剩余时间可以看到它。

但是有一个问题:只有支付了必要的0.02以太网费用的地址才能播出他们的意见。听起来不太公平,但就这样。

Remix,以太坊的在线代码编辑器非常出色,因此在那里创建一个新文件并粘贴以下代码。它是用Solidity(Smart
Contracts的编程语言)编写的。如果代码没有太多意义并不重要,我们将在稍后详细介绍相关部分,但最终这是一个Python教程。

pragma solidity ^0.4.0;contract SoapBox {// Our 'dict' of addresses that are approved to share opinions //我们批准分享意见的地址的“字典” mapping (address => bool) approvedSoapboxer; string opinion; // Our event to announce an opinion on the blockchain //我们的事件发布对区块链的意见 event OpinionBroadcast(address _soapboxer, string _opinion);// This is a constructor function, so its name has to match the contract //这是一个构造函数,所以它的名字必须与合约相匹配 function SoapBox() public { } // Because this function is 'payable' it will be called when ether is sent to the contract address. //因为这个函数是“支付”,所以当以太网被发送到合约地址时将被调用。 function() public payable{ // msg is a special variable that contains information about the transaction // msg是一个特殊变量,包含有关交易的信息 if (msg.value > 20000000000000000) { //if the value sent greater than 0.02 ether  //如果发送的值大于0.02 ether // then add the sender's address to approvedSoapboxer //然后将发件人的地址添加到approvedSoapboxer approvedSoapboxer[msg.sender] = true; } } // Our read-only function that checks whether the specified address is approved to post opinions. //我们的只读函数,用于检查指定地址是否被批准发布意见。 function isApproved(address _soapboxer) public view returns (bool approved) { return approvedSoapboxer[_soapboxer]; } // Read-only function that returns the current opinion //返回当前意见的只读函数 function getCurrentOpinion() public view returns { return opinion; }//Our function that modifies the state on the blockchain //我们的函数修改了区块链上的状态 function broadcastOpinion(string _opinion) public returns (bool success) { // Looking up the address of the sender will return false if the sender isn't approved //如果发件人未获批准,查找发件人的地址将返回false if (approvedSoapboxer[msg.sender]) { opinion = _opinion; emit OpinionBroadcast(msg.sender, opinion); return true; } else { return false; } }}

以下是Metamask变得非常有用的地方:如果你点击重新混音窗口右上角的“run”运行标签并在“Environment”环境下拉列表中选择“Injected
Web3”注入的Web3,则“Account”帐户下拉列表中应填充你的帐户地址早在MetaMask中创建。如果没有,只需刷新浏览器即可。

图片 3image

然后单击“create”创建。Metamask应该弹出一个弹出窗口,要求你确认交易。如果没有,只需打开Metamask扩展并在那里执行:

图片 4image

你将在Remix控制台底部收到一条消息,告知你合约的创建正在等待处理。单击链接以在Etherscan上查看其状态。如果刷新并且“To”收件人字段填充了合约地址,则合约已成功部署。

一旦你记下了合约地址,我们就该开始通过Web3.py与合约进行交互了。

在我看来,有四种方式可以与以太坊智能合约进行互动。最后两个经常混在一起,但差异很重要。我们已经看到了第一个:在区块链上部署智能合约。现在我们将介绍其余的python:

  • 向合约发送以太:真正自我解释,将以太币从钱包发送到智能合约的地址。希望换取有用的东西。
  • 调用函数:执行智能合约的只读功能以获取某些信息。
  • 与功能进行交易:执行智能合约的功能,该功能可以更改区块链的状态。
  • 查看事件:查看由于先前的功能交易而发布到区块链的信息。

一些智能合约包括“payable”应付功能。如果你将Ether发送到合约的地址,则会触发这些功能。一个典型的用例就是ICO:将以太送到合约中,然后返回给你的是代币。

首先,我们将从导入开始,创建一个新的web3对象,通过Infura.io连接到Ropsten
TestNet。

import timefrom web3 import Web3, HTTPProvidercontract_address = [YOUR CONTRACT ADDRESS]wallet_private_key = [YOUR TEST WALLET PRIVATE KEY]wallet_address = [YOUR WALLET ADDRESS]w3 = Web3(HTTPProvider([YOUR INFURA URL]))w3.eth.enable_unaudited_features()

你可以在Metamask中的帐户名称旁边的菜单中找到你的钱包私钥。因为我们使用的Web3.py的某些功能尚未经过完全审核以确保安全性,所以我们需要调用w3.eth.enable_unaudited_features()来确认我们知道可能会发生问题的情况。我告诉过你我们用私钥做了一些危险的事情!

现在我们将编写一个函数,将以太币从我们的钱包发送到合约:

def send_ether_to_contract(amount_in_ether): amount_in_wei = w3.toWei(amount_in_ether,'ether'); nonce = w3.eth.getTransactionCount(wallet_address) txn_dict = { 'to': contract_address, 'value': amount_in_wei, 'gas': 2000000, 'gasPrice': w3.toWei('40', 'gwei'), 'nonce': nonce, 'chainId': 3 } signed_txn = w3.eth.account.signTransaction(txn_dict, wallet_private_key) txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction) txn_receipt = None count = 0 while txn_receipt is None and (count < 30): txn_receipt = w3.eth.getTransactionReceipt print(txn_receipt) time.sleep if txn_receipt is None: return {'status': 'failed', 'error': 'timeout'} return {'status': 'added', 'txn_receipt': txn_receipt}

首先让我们回顾一下交易字典txn_dict:它包含了定义我们发送给智能合约的交易所需的大部分信息。

  • to:我们将以太送到哪里(在这种情况下是智能合约)。
  • Vaule:我们送多少钱单位wei。
  • gas:gas是衡量在以太坊上执行交易的计算工作量度。在这种情况下,我们指定了我们愿意执行此交易的天然气量的上限。
  • gasPrice:我们愿意为每单位gas支付多少钱。
  • Nonce:这是一个地址nonce而不是更常见的工作证明。它只是发送地址所做的先前交易次数的计数,用于防止双重花费。
  • Chain ID:每个以太坊网络都有自己的链ID:主网的ID为1,而Ropsten为3。你可以在这里找到更长的列表。

关于gas限制的快速说明:有一些功能可以让你估算交易将使用多少gas。但是,我发现选择限制的最佳方法是计算出你愿意支付多少钱,然后再让交易失败,然后再去做。

一旦我们定义了交易的重要部分,我们就会使用我们钱包的私钥对其进行签名。然后它就可以发送到网络了,我们将使用sendRawTransaction方法。

在矿工决定将其包含在一个区块中之前,我们的交易实际上不会完成。一般而言,你为每个单位支付的费用Gas(记住我们的天然气价格参数)决定了一个节点决定将你的交易包含在一个区块中的速度。

图片 5image

此时间延迟意味着交易是异步的。当我们调用sendRawTransaction时,我们会立即获得交易的唯一哈希值。你可以随时使用此哈希来查询你的交易是否已包含在块中。我们知道,当且仅当我们能够获得交易收据时才将交易添加到区块链中(因为所有好的购买都带有收据吗?)。这就是为什么我们创建循环来定期检查我们是否有收据:

 txn_receipt = None count = 0 while txn_receipt is None and (count < 30): txn_receipt = w3.eth.getTransactionReceipt print(txn_receipt) time.sleep

值得注意的是,交易可以添加到区块链中,但仍然因各种原因而失败,例如没有足够的gas。

这就是将以太符号发送给合约的Python代码。让我们快速回顾一下我们在Solidity中写的应付函数:

function() public payable{ if (msg.value >= 20000000000000000) { approvedSoapboxer[msg.sender] = true; } }

Msg是智能合约中的一个特殊变量,其中包含有关发送到智能合约的交易的信息。在这种情况下,我们使用msg.value,它给出了交易中发送的Ether数量(在Wei而不是raw
Ether中)。同样,msg.sender给出了进行交易的钱包的地址:如果已经发送了足够的以太币,我们会将其添加到已批准帐户的字典中。

继续运行send_ether_to_contract函数。希望你能收到回执。你还可以通过在Etherscan的Ropsten
Network部分查找你的钱包地址来检查交易是否完成。我们将在下一节中获得Python中的更多信息。

智能合约

以太坊不仅仅在区块链上存储交易记录,也保存智能合约代码。你可以理解为,双方在区块链上交易转账时,触发执行的一段代码

在以太坊网络中,智能合约使用Solidity语言来编写业务逻辑,然后将合约代码编译为以太坊字节码部署到区块链上。

    编写以太坊合约

web3.eth.getBalance('钱包地址', function(err,result) {
    if (err == null) {
        console.log('~balance:'+result);
    }else  {
        console.log('~error:'+err);
    }
});

调用一个函数

我们刚刚向我们的智能合约发送了一些以太币,因此我们想检查我们的钱包地址是否已被批准分享意见是有意义的。为此,我们在智能合约中定义了以下功能:

function isApproved(address _soapboxer) public view returns (bool approved) { return approvedSoapboxer[_soapboxer]; }

与python相比,这个函数附带了很多额外的东西,比如声明类型。尽管如此,这个函数只需要一个地址(_soapboxer参数),在有效的哈希表/python
dict中查找相应的批准布尔值并返回该值。

你调用的时候一个智能合约函数,以太坊节点将计算结果,并将其返回给你。这里的事情变得有点复杂:调用是只读的,这意味着它们不会对区块链进行任何更改。如果上述函数包含一行代码来记录数字时间,则检查地址是否已批准:

approvedCheckedCount[_soapboxer] = approvedCheckedCount[_soapboxer] + 1

然后,当调用该函数时,该节点将计算approvedCheckedCount的新值,但一旦返回结果就丢弃它。

作为只读的交换,函数调用不会花费你运行任何以太,因此你可以愉快地检查帐户是否已被批准而不必担心成本。

让我们跳回到我们的python文件的顶部并添加一些更多的设置代码。

import contract_abicontract = w3.eth.contract(address = contract_address, abi = contract_abi.abi)

你需要创建另一个名为contract_abi的python文件。这将包含一个大的JSON信息字符串,Python需要与我们在智能合约中定义的函数进行交互,称为应用程序二进制接口。你可以在Remix中找到智能合约的ABI的JSON字符串:

  • 单击编译“Compile”选项卡。
  • 单击详细信息“Details”——应显示包含大量信息的模式。
  • 向下滚动到ABI部分,然后单击复制到剪贴板“Copy to clipboard”图标。

将复制的字符串粘贴到contract_abi.py文件中,该文件应如下所示:

abi = """[ { A BIG LIST OF ABI INFO SPREAD ACROSS MULTIPLE DICTS }]""

我们添加到主python文件的另一行现在使用此ABI
JSON字符串并使用它来设置合约对象。如果你浏览合约,你会注意到它包含一个函数属性,其中包含我们在智能合约中创建的三个函数。

现在我们将创建一个python函数,该函数调用Smart Contract智能合约的isApproved函数来检查指定的地址是否被批准分享意见。

def check_whether_address_is_approved: return contract.functions.isApproved.call()

那很短暂。

你现在可以使用它来检查你的钱包地址是否已获批准。如果你之前运行了send_ether_to_contract函数并发送了足够数量的以太,那么希望你能回到true

以太坊虚拟机

在每个节点包含一个以太坊虚拟机(EVM: Ethereum Virtual
Machine)来执行智能合约代码,这一点是区别于比特币最核心的一点。

需要用到的前导知识背景

查看交易

与函数交易

我们正在与智能合约进行最后的主要互动:广播意见。再一次,我们来看看我们的Solidity
Code:

function broadcastOpinion(string _opinion) public returns (bool success) { if (approvedSoapboxer[msg.sender]) { opinion = _opinion; emit OpinionBroadcast(msg.sender, opinion); return true; } else { return false; } }

这里没有什么新东西:我们采用传入的_opinion参数并使用它来设置全局变量意见。(如果你愿意,可以通过getter函数查询实习生)。有一条线有点不同:

emit OpinionBroadcast(msg.sender, opinion)

我们很快就会介绍。

当你通过交易与智能合约的功能进行交互时,功能对智能合约状态所做的任何更改都会在区块链上发布。为了换取这种特权,你必须向矿工支付一些的以太量。Python时间:

def broadcast_an_opinion: nonce = w3.eth.getTransactionCount(wallet_address) txn_dict = contract.functions.broadcastOpinion.buildTransaction({ 'chainId': 3, 'gas': 140000, 'gasPrice': w3.toWei('40', 'gwei'), 'nonce': nonce, }) signed_txn = w3.eth.account.signTransaction(txn_dict, private_key=wallet_private_key) result = w3.eth.sendRawTransaction(signed_txn.rawTransaction) tx_receipt = w3.eth.getTransactionReceipt count = 0 while tx_receipt is None and (count < 30): time.sleep tx_receipt = w3.eth.getTransactionReceipt print(tx_receipt) if tx_receipt is None: return {'status': 'failed', 'error': 'timeout'} processed_receipt = contract.events.OpinionBroadcast().processReceipt(tx_receipt) print(processed_receipt) output = "Address {} broadcasted the opinion: {}"\ .format(processed_receipt[0].args._soapboxer, processed_receipt[0].args._opinion) print return {'status': 'added', 'processed_receipt': processed_receipt}

这实际上与将Ether发送到智能合约时使用的过程相同。我们将创建并签署一个交易,然后将其发送到网络。再一次,交易是异步的,这意味着无论函数被告知在Solidity代码中返回什么,你实际得到的东西总是交易的哈希。

鉴于交易本身并没有返回任何有用的信息,我们需要其他东西。这导致我们采用最后方式与智能合约进行互动。

Solidity语言

browser-solidity
提供了在线的Solidity语言测试,也可以从这里下载包括Solidity运行环境的安装包

下一篇:
以太坊应用实战3-基于nodejs开发DAPP


=====

    面向对象开发语言基础,python,java等

web3.eth.getTransaction('交易hash码',function (err, result) {
    if (err == null) {
        console.log('transaction:'+result);
    } else {
        console.log('error:'+err);
    }
});

事件events

我将事件称为与智能合约交互的“一半”方式,因为从技术上讲,它们是由交易发出的。
事件是智能合约以易于阅读的形式在区块链上记录事物的方式,它们基本上只是一组可以使用特定交易的收据查找的值。我们在智能合约的最顶层定义了一个:

event OpinionBroadcast(address _soapboxer, string _opinion);

然后,当我们使用broadcastOpinion函数时,我们使用它向区块链发出信息。

将交易添加到块后,你可以使用交易哈希查询区块链以查找OpinionBroadcast事件发出的特定值。这是我们在函数broadcast_an_opinion中的最后一点python代码。你会注意到我们要求事件发出的信息存储在’args’属性中。

这个事件非常公开。实际上,任何人都可以轻松使用Etherscan或类似工具来查看智能合约发出的所有事件的日志。

图片 6image

Etherscan会自动检测“Transfer”转移事件并列出所有事件。Nifty

如果你已经做到这一点,你就有权发表意见。继续用你选择的意见运行broadcast_an_opinion

如果一切顺利进行,你应该很快就会收到已处理的收据,以及已放入区块链的OpinionBroadcast事件的打印输出。

Nice。

这是完整的python代码:

import timefrom web3 import Web3, HTTPProvidercontract_address = [YOUR CONTRACT ADDRESS]wallet_private_key = [YOUR TEST WALLET PRIVATE KEY]wallet_address = [YOUR WALLET ADDRESS]w3 = Web3(HTTPProvider([YOUR INFURA URL]))w3.eth.enable_unaudited_features()contract = w3.eth.contract(address = contract_address, abi = contract_abi.abi)def send_ether_to_contract(amount_in_ether): amount_in_wei = w3.toWei(amount_in_ether,'ether'); nonce = w3.eth.getTransactionCount(wallet_address) txn_dict = { 'to': contract_address, 'value': amount_in_wei, 'gas': 2000000, 'gasPrice': w3.toWei('40', 'gwei'), 'nonce': nonce, 'chainId': 3 } signed_txn = w3.eth.account.signTransaction(txn_dict, wallet_private_key) txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction) txn_receipt = None count = 0 while txn_receipt is None and (count < 30): txn_receipt = w3.eth.getTransactionReceipt print(txn_receipt) time.sleep if txn_receipt is None: return {'status': 'failed', 'error': 'timeout'} return {'status': 'added', 'txn_receipt': txn_receipt}def check_whether_address_is_approved: return contract.functions.isApproved.call()def broadcast_an_opinion: nonce = w3.eth.getTransactionCount(wallet_address) txn_dict = contract.functions.broadcastOpinion.buildTransaction({ 'chainId': 3, 'gas': 140000, 'gasPrice': w3.toWei('40', 'gwei'), 'nonce': nonce, }) signed_txn = w3.eth.account.signTransaction(txn_dict, private_key=wallet_private_key) result = w3.eth.sendRawTransaction(signed_txn.rawTransaction) tx_receipt = w3.eth.getTransactionReceipt count = 0 while tx_receipt is None and (count < 30): time.sleep tx_receipt = w3.eth.getTransactionReceipt print(tx_receipt) if tx_receipt is None: return {'status': 'failed', 'error': 'timeout'} processed_receipt = contract.events.OpinionBroadcast().processReceipt(tx_receipt) print(processed_receipt) output = "Address {} broadcasted the opinion: {}"\ .format(processed_receipt[0].args._soapboxer, processed_receipt[0].args._opinion) print return {'status': 'added', 'processed_receipt': processed_receipt}if __name__ == "__main__": send_ether_to_contract is_approved = check_whether_address_is_approved(wallet_address) print(is_approved) broadcast_an_opinion('Despite the Constant Negative Press')

    数据库基本概念

转账

打包封装

所以关于它。正如我所提到的,我们还没有达到使用python实际部署智能合约很容易的地步,但其他一切都在那里。在Sempo,我们正在使用上面提到的所有技术来使问题响应更加透明。

感谢Sebastian Dirman指出w3.toWei(value,
‘ether’)是一种更好的方式在Ether和Wei之间进行转换——只需将以太量乘以1000000000000000000即可导致类型错误!

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

分享一些以太坊、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语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是原文Python以太坊智能合约开发指南

    HTML/CSS/JS

此处需要载入ethereumjs-tx模块:

下一篇: 初识区块链

cd wallet
npm install ethereumjs-tx --save

var Tx = require('ethereumjs-tx');
var privateKey = new Buffer('钱包账户私钥', 'hex');
var rawTx = {
    nonce: nonce,
    gasPrice: '0x3b9aca00',
    gasLimit: '0x493e0',
    to: '收钱地址',
    value: '金额数',
    data: ''
};
var tx = new Tx(rawTx);
tx.sign(privateKey);

var serializedTx = tx.serialize();
web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
    console.log('交易结果:'+hash);
    if (callback && typeof(callback) === "function") {
        if (!err)
            callback(null, hash);
        else
            callback(err, null);
    }
});
node app.js    //执行

这里要注意nonce的使用,nonce是指同一个账号在同一个节点下,发起的交易排序号。nonce从0开始算起,每次加一。如果你的账号当前nonce是10,你发起了nonce为12的交易A,那么只有nonce为10、11的交易完成了,才轮到nonce为12的交易A。中间如果这个节点重启了,那么这个交易A就会被取消掉。建议用web3.eth.getTransactionCount(‘你的钱包地址’)
来获取当前nonce,每次加一。


后续,使用NodeJS开发接口给前端、移动端使用。。

参考:https://github.com/ethereum/wiki/wiki/JavaScript-API\#web3ethgettransactioncount

发表评论

电子邮件地址不会被公开。 必填项已用*标注