使用 Python 将 Web3 智能合约连接到 Ganache CLI

构建连接到 Ganache CLI 的 Web3 智能合约脚本,以便使用 Python 开发和测试 DApp。

对于Web3.0智能合约开发来说,测试或UAT是智能合约在真正的区块链网络上运行之前最重要的流程之一。因此,我将探索如何使用 Python 和 Ganache 开发脚本并构建测试本地环境的智能合约。

使用 Ganache 和 Python 构建部署在本地可视化以太坊区块链上的 Web3 智能合约的成分

Python3、Ganache、Solcx、Solidity、Web3、Json、os、dotenv

议程

Web3 智能合约 – 安装 Solcx 并 Jsonify 您的 Solidity 文件

首先,该脚本需要一种语言来在区块链平台上实现智能合约,例如最著名的以太坊。对于语言,我使用 Solidity,并将在另一篇即将发表的文章中分享更多详细信息。

在Solidity方面,我们可以使用Solcx在Python开发环境中编译智能合约数据集。 Solc Solidity 编译器的 Python 包装器和版本管理工具。

如果您想获得本文的 Solidity 文件 easy2digital.sol,订阅我们的时事通讯并留言“Web3.0 + 1 Solidity 和 Ganache” 。我们会尽快发送给您。

步骤1.安装Solcx,在Python脚本中打开并编译Solidity文件

以Mac为例。下面是终端中 Solcx 的安装:

pip install py-solc-x

然后,我们需要在Python脚本中导入Solcx和所需的方法

From solcx import compile_standard

With open(“./your solidity file name.sol”, “r”) as file:

Single_contract_file = file.read()

最后我们需要使用compile_standard方法将sol文件信息编译成变量

compiled_sol = compile_standard(

{

"language": "Solidity",

"sources": {"your file name.sol": {"content": ;single_contract_file}},

"settings": {

"outputSelection": {

"*": {"*": ["abi", "metadata", "evm.bytecode", "evm.sourceMap"]}

}

},

},

solc_version="0.8.7",

)

步骤2.Jsonify编译后的文件

为了更方便地获取文件数据以及与区块链网络和交易交互,我们可以将编译后的数据jsonify为json数据格式。代码如下:

with open("compiled_solCode.json", "w") as file:

json.dump(compiled_sol, file)

Web3 智能合约 – 字节码和 ABI

ABI 和字节码信息对于与以太坊区块链网络交互和控制计算机通信都至关重要。

字节码

字节码是包含二进制指令的信息。编写的每一行代码都会被分解为操作码,以便计算机准确地知道运行代码时要做什么。

在以太坊世界中,字节码实际上是部署到以太坊区块链上的。当我们部署到以太坊网络并使用基于浏览器的钱包(如 Metamask)确认交易时,我们实际上可以看到部署的字节码。

# Get Bytecode

Bytecode = compiled_sol['contracts']['easy2digital.sol']['SingleContract']["evm"]["bytecode"]["object"]

ABI

ABI 是应用程序二进制接口。它定义了智能合约中可用的方法和变量,我们可以使用它们与该智能合约进行交互。由于智能合约在部署到区块链之前会转换为字节码,因此我们需要一种方法来了解可以与它们发起哪些操作和交互。

然后我们需要一种标准化的方式来表达这些接口,以便任何编程语言都可以用来与智能合约交互。

您的应用程序可以使用任何编码语言与智能合约进行交互,只要您拥有该智能合约的 ABI 和一个库来帮助您与任何一个节点进行通信,为您提供进入以太坊网络的入口点。

下面是在 easy2digital.sol 中生成 ABI 值的代码,如下所示:

# Get ABI

getABI = compiled_sol['contracts']['SimpleStorage.sol']['SimpleStorage']['abi']

安装 Web3 模块并连接到 Ganache

当用于获取智能合约编译文件中的方法和变量的字节码和ABI准备好后,就可以安装用于以太坊交互的模块了。 Python 中称为 Web3 模块

在终端中,我们输入该命令如下:

pip install web3

在Python脚本中,也请使用代码输入模块

from web3 import Web3

伽纳彻

然后,为了开发一个Web3智能合约测试环境,我们需要一个可视化的以太坊区块链,而不是通过Metamask连接到真实的区块链。所以这里我们需要一个叫做 Ganache 的软件。

Ganache 为 Web3 开发人员提供了便利,因为它为您提供了个人以太坊区块链,您可以使用它来运行测试、执行命令和检查状态,同时控制链的运行方式。

安装方法超级简单。之后,您可以快速打开以太坊并打开可视化的 ETH 网络仪表板。在仪表板上,有几个需要在 Python 脚本上使用的元素。项目清单如下:

  • HTTP 网址
  • 链号
  • 可视化加密钱包地址
  • 钱包私钥

对于链 ID,Ganache 有时可能存在错误,并且您的唯一 ID 可能不起作用。如果您遇到这种情况,请尝试1337链id。

然后,这里是使用Web3模块连接Ganache的代码。

w3 = Web3(Web3.HTTPProvider("your ganache HTTP URL"))

gasPrice = w3.eth.gas_price

chain_id = "your ganache chain id"

my_address = "select a key and copy and paste the address here"

隐藏加密货币钱包私钥

事实上,Ganache 模拟了一个将 Web3 与真实的以太坊区块链连接起来的环境。以Metamask为例,地址等于真实钱包地址,私钥是真实钱包私钥。然而,您不想在服务器上泄露您的私钥,因为这有丢失所有资金的风险。

所以在DApp或者Web3中,我们需要在Python脚本中隐藏私钥。这里我们会使用 . env and gitignore.

首先,我们需要创建一个 .env 文件并将其放在与 Python 脚本相同的文件夹中。

这是 env 文件中的代码:

export PRIVATE_KEY="0x + your private key"
其次,请在同一文件夹中添加一个.gitinore文件
最后但并非最不重要的一点是,我们可以导入os, dotenv并使用getenv()方法来调用 env 文件中的变量
import os
from dotenv import load_dotenv
private_key = os.getenv("PRIVATE_KEY")

在以太坊区块链上创建智能合约

正如前面提到的,我们使用 Solidity 来编写智能合约逻辑。那么,问题是如何将这个逻辑部署到区块链上。 Web3模块提供了contract() ,方便我们完成流程。

singleContractA = w3.eth.contract(abi=getABI, bytecode=Bytecode)
如果您想生成交易计数 ID,我们可以使用getTransactionCount()
nonceA = w3.eth.getTransactionCount(my_address)

激活交易功能 – 构建、签名、发送和确认交易

Web3.0的核心价值是去中心化的交易和支付处理。从现在开始,只要您的企业和客户都愿意使用加密货币进行交易,你们都不需要通过传统的银行系统。这意味着很多!

因此,与区块链交互的关键部分之一是建立交易流。无论您平时进行何种业务或交易,基本上都有四个基本步骤,如下:

# Build a transaction
transactionA = singleContractA.constructor().buildTransaction(
{"gasPrice": gasPrice, "chainId": int(chain_id), "from": my_address, "nonce": nonceA})
# Sign a transaction
signedTransaction = w3.eth.account.sign_transaction(
transactionA, private_key=private_key)
# Send a transaction
transactionHash = w3.eth.send_raw_transaction(signedTransaction.rawTransaction)
# Wait for the pending and confirmed transaction response
transactionReceipt = w3.eth.wait_for_transaction_receipt(transactionHash)

添加特定价值并更新合同

此外,您还可以更新现有交易并添加特定价值。

singleContractB = w3.eth.contract(
address=transactionReceipt.contractAddress, abi=getABI)

print("Updating the contract.....")
contractTransaction = singleContractB.functions.store(75).buildTransaction(
{"gasPrice": gasPrice, "chainId": int(chain_id), "from": my_address, "nonce": nonceA + 1})
signedcontractTransaction = w3.eth.account.sign_transaction(
contractTransaction, private_key=private_key)
# Send the transaction
print("Deploying the contract.....")
sendcontractTransaction = w3.eth.send_raw_transaction(signedcontractTransaction.rawTransaction)
# Wait for the pending and confirmed transaction response
print("Deployed!!!")
transactionReceipt = w3.eth.wait_for_transaction_receipt(sendcontractTransaction)
print(singleContractB.functions.retrieve().call())

Web3智能合约连接Ganache的完整Python脚本

如果您对 Web3.0 教程 1 – 使用 Python 将 Web3 智能合约连接到 Ganache 来开发和测试 DApp 感兴趣,请添加消息“Web3.0教程1”来订阅我们的新闻通讯。我们会立即将脚本发送到您的邮箱。

我希望您喜欢阅读 Web3.0 教程 1 – 使用 Python 将 Web3 智能合约连接到 Ganache 来开发和测试 DApp。如果您这样做了,请通过执行下列操作之一来支持我们,因为这总是对我们的频道有所帮助。