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

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

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

设置

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

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

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

Pyethereum

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

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

Web3.py

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

好的,少说多做!

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

继续并pip-install web3 (确保你获得版本4)。

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

image

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

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

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

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

部署智能合约

使用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 (in Wei)//如果发送的值大于0.02 ether(在Wei中) // 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(string) {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中创建。如果没有,只需刷新浏览器即可。

image

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

image

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

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

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

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

将以太币发送给合约

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

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

import time
from 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 = Nonecount = 0while txn_receipt is None and (count < 30):txn_receipt = w3.eth.getTransactionReceipt(txn_hash)print(txn_receipt)time.sleep(10)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支付多少钱(以wei为单位)。
  • Nonce:这是一个地址nonce而不是更常见的工作证明。它只是发送地址所做的先前交易次数的计数,用于防止双重花费。
  • Chain ID:每个以太坊网络都有自己的链ID:主网的ID为1,而Ropsten为3。你可以在这里找到更长的列表。

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

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

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

https://ethgasstation.info/是一个很好的地方,可以确定你将等待你的交易包含在一个区块中的时间。

image

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

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

值得注意的是,交易可以添加到区块链中,但仍然因各种原因而失败,例如没有足够的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中的更多信息。

调用一个函数

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

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

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

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

approvedCheckedCount[_soapboxer] = approvedCheckedCount[_soapboxer] + 1

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

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

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

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

你需要创建另一个名为contract_abi的python文件。这将包含一个大的JSON信息字符串,Python需要与我们在智能合约中定义的函数进行交互,称为应用程序二进制接口(ABI)。你可以在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(address):return contract.functions.isApproved(address).call()

那很短暂。

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

与函数交易

我们正在与智能合约进行最后的主要互动:广播意见。再一次,我们来看看我们的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(covfefe):nonce = w3.eth.getTransactionCount(wallet_address)txn_dict = contract.functions.broadcastOpinion(covfefe).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(result)count = 0while tx_receipt is None and (count < 30):time.sleep(10)tx_receipt = w3.eth.getTransactionReceipt(result)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(output)return {'status': 'added', 'processed_receipt': processed_receipt}

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

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

事件events

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

event OpinionBroadcast(address _soapboxer, string _opinion);

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

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

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

image

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

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

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

Nice。

这是完整的python代码:

import time
from 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 = Nonecount = 0while txn_receipt is None and (count < 30):txn_receipt = w3.eth.getTransactionReceipt(txn_hash)print(txn_receipt)time.sleep(10)if txn_receipt is None:return {'status': 'failed', 'error': 'timeout'}return {'status': 'added', 'txn_receipt': txn_receipt}def check_whether_address_is_approved(address):return contract.functions.isApproved(address).call()def broadcast_an_opinion(covfefe):nonce = w3.eth.getTransactionCount(wallet_address)txn_dict = contract.functions.broadcastOpinion(covfefe).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(result)count = 0while tx_receipt is None and (count < 30):time.sleep(10)tx_receipt = w3.eth.getTransactionReceipt(result)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(output)return {'status': 'added', 'processed_receipt': processed_receipt}if __name__ == "__main__":send_ether_to_contract(0.03)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、比特币等区块链相关的交互式在线编程实战教程:

  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

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

Python智能合约开发指南(以太坊+web3py)相关推荐

  1. 以太坊Python智能合约开发指南

    在以太坊上获得一个基本的智能合约是一个很简单的事,只需google查询"ERC20代币教程",你会发现有关如何做到这一点的大量信息.以编程方式与合约交互完全是另一回事,如果你是一个 ...

  2. Python以太坊智能合约开发指南

    在以太坊上获得一个基本的智能合约是一个很简单的事,只需google查询"ERC20代币教程",你会发现有关如何做到这一点的大量信息.以编程方式与合约交互完全是另一回事,如果你是一个 ...

  3. 头歌-信息安全技术-用Python实现自己的区块链、支持以太坊的云笔记服务器端开发、编写并测试用于保存云笔记的智能合约、支持以太坊的云笔记小程序开发基础

    头歌-信息安全技术-用Python实现自己的区块链.支持以太坊的云笔记服务器端开发.编写并测试用于保存云笔记的智能合约.支持以太坊的云笔记小程序开发基础 一.用Python实现自己的区块链 1.任务描 ...

  4. Solidity智能合约开发 — 1-以太坊开发工具和部署

    Solidity简介 solidity 是为实现智能合约而创建的一个高阶编程语言.也是以太坊虚拟机(EVM)智能合约的语言. Solidity开发工具remix remix是以太坊官方推荐的在线开发工 ...

  5. 服务器端调用智能合约,《精通以太坊:开发智能合约和去中心化应用》 ——3.4 远程调用以太坊客户端...

    远程调用以太坊客户端 远程调用以太坊的客户端是指相比全功能客户端,只提供了一部分功能的客户端.这些客户端通常不会保存完整的区块链数据,所以它们的启动速度更快,也不会消耗大量的磁盘空间. 远程调用以太坊 ...

  6. 张家口以太坊智能合约开发实战pdf_以太坊的再次腾飞,你看得懂么?

    最近以太坊涨势明显,主要原因来源于一个平台对他的推广.那么,我们就来了解一下,这个平台是怎么回事儿.对以太坊的生态,会有什么样的帮助. ------------------------ FORSAGE ...

  7. 区块链开发语言python_Python:不同区块链智能合约开发语言的选择

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 在本文中,将介绍比特币.超级账本Fabric和以太坊这三种区块链中,分别使用什么开发语言来进行智能合约的编程,并提供你进 ...

  8. BSN智能合约开发培训-CITA(三)

    1 智能合约的定义 1994年,计算机科学家和密码学家 Nick Szabo 首次提出"智能合约"概念.它早于区块链概念的诞生.Szabo 描述了什么是"以数字形式指定的 ...

  9. NFT及智能合约开发

    文章目录 1.Web3.0 1.1 GameFi 1.2 DeFi 1.3 dApp 2.NFT 2.1 NFT Applications 2.2 NFT Earning 2.3 NFT结构 2.3 ...

最新文章

  1. SystemML大规模机器学习,优化算子融合方案的研究
  2. java利用递归画杨辉三角_用java程序编写杨辉三角形,初学者适用
  3. Linux 系统上的库文件生成与使用
  4. 对未标记为可安全执行的脚本_Script Debugger for Mac(脚本调试软件)
  5. python程序设计祁瑞华答案_【单选题】有六个元素 6 , 5 , 4 , 3 , 2 , 1 的顺序进栈,问下列哪一个不是合法的出栈序列? (2.0分)...
  6. 在Linux上配置Telnet服务
  7. phpstrom连接服务器上传文件
  8. 类与接口(三)java中的接口与嵌套接口
  9. 音视频技术开发周刊 | 186
  10. Flex 常见问题解答(from MM)
  11. 虚拟机安装与概述(3)
  12. 计算机基础知识教案1,计算机基础知识教案一
  13. python pptp链接_pptp-client连接设置
  14. Android doc |Getting Started|部分 转载 --管理Activity生命周期
  15. 这N张模板,做出了秒杀echarts和python的可视化大屏,老板很满意
  16. OBS 进阶之 DXGI 采集屏幕流程,并如何修改为自己的光标
  17. 玩苹果为什么要越狱?
  18. WORD2010文档里面突然不能输入汉字的解决办法
  19. hdu-1052 Tian Ji -- The Horse Racing
  20. Win11玩游戏掉帧的解决方法

热门文章

  1. 【百度领航团】小白零基础python学习笔记
  2. nba2k19显示服务器不可用,NBA2K19打不开怎么办 NBA2K19无法运行解决办法
  3. 2k14无法打开因为计算机,nba2k14打不开进不去怎么办 nba2k14按键无法运行解决教程...
  4. 电容笔哪个厂家的产品比较好?苹果平板的电容笔推荐
  5. YUV文件免费下载网址
  6. uniApp H5唤醒App
  7. QQ账号密码的保存与读取
  8. 读英语计算机书籍读后感,读英语小说的读后感(精选14篇)
  9. 文件夹变成计算机程序,文件夹变成exe快速解决方法
  10. 征信报告上哪些信息影响你的下卡率?