Ganache-cli Python

Bạn có quan tâm đến việc xây dựng trên Ethereum bằng Python không?

Cho dù bạn mới bắt đầu học lập trình hay bạn là một nhà phát triển JavaScript tò mò, người luôn thấy mọi thứ về Python 2/3 hơi khó hiểu, loạt bài hướng dẫn này đều dành cho bạn. Chúng ta sẽ xem qua tất cả các bước cần thiết để cài đặt và khám phá tất cả các lĩnh vực chức năng chính. Chẳng bao lâu nữa bạn sẽ hết cảm giác như thế này…

Tôi khi tôi cố viết mã bất cứ thứ gì ở giao diện người dùng

để này

Tương lai bạn, hack gibson

Nếu bất cứ lúc nào bạn cảm thấy lạc lõng, vui lòng tham gia cùng chúng tôi trên Gitter và yêu cầu hỗ trợ

Hãy đi sâu vào

Cài đặt

Trước khi chúng tôi có thể cài đặt Brownie, chúng tôi cần cài đặt một số phụ thuộc. Brownie dựa trên ganache-cli được viết bằng JavaScript. Điều này có nghĩa là chúng ta sẽ cần có cả Python và Node. js đã cài đặt. Hãy bắt đầu với các phần JavaScript

Cài đặt nút. js và npm

Trước tiên, hãy kiểm tra xem liệu Node. js và npm đã được cài đặt. Mở một cửa sổ đầu cuối và gõ các lệnh sau

node -v
npm -v

Nếu một trong hai lệnh trả về thông báo lỗi, chúng ta sẽ cần cài đặt Node. js và npm. Chúng tôi cần ít nhất phiên bản 6.11.5 của Node. js để chạy Ganache

Cài đặt Ganache-CLI

Khi nút. js đã được cài đặt, chúng tôi đã sẵn sàng để cài đặt Ganache

Ganache là một chuỗi khối tạm thời mà chúng tôi có thể sử dụng để thử nghiệm và phát triển. Nó cung cấp 10 tài khoản đã mở khóa được tài trợ với 100 ether mỗi tài khoản và khai thác các giao dịch khi chúng được phát sóng. Nó cũng cho phép chúng tôi làm những điều kỳ diệu như hoàn nguyên các giao dịch và tăng tốc về phía trước, đây là một trợ giúp rất lớn khi thử nghiệm đơn vị

Ganache có hai hương vị. phiên bản GUI hoàn chỉnh với trình khám phá khối và phiên bản CLI được sắp xếp hợp lý hơn. Đối với Brownie, chúng tôi sẽ sử dụng phiên bản CLI

Để cài đặt ganache-cli

npm install -g ganache-cli

Sau đó, chúng tôi có thể xác minh rằng nó đã được cài đặt chính xác

ganache-cli --version

Lưu ý rằng không giống như Truffle, Brownie không yêu cầu bạn tự khởi chạy Ganache. Brownie sẽ tự quản lý quá trình này một cách vui vẻ. Sau khi cài đặt, bây giờ chúng ta có thể tiếp tục và không bao giờ nghĩ về Ganache nữa

Cài đặt Python và pipx

Được rồi, chúng ta đã đi được nửa chặng đường và chúng ta đã hoàn thành với các bit không phải Python. Tùy thuộc vào nền tảng của bạn, điều này có thể có nghĩa là phần khó nhất đã kết thúc hoặc chỉ mới bắt đầu. Nhưng đừng lo lắng, Python là một kẻ rình mò thân thiện 🐍

Trước tiên, hãy kiểm tra xem Python đã được cài đặt chưa. Nếu bạn đang sử dụng Linux hoặc OSX thì rất có thể đó là

python --version

Nếu bạn nhận được thông báo lỗi, bạn sẽ cần cài đặt Python. Nếu số phiên bản được hiển thị bắt đầu bằng 2, hãy thay thế python bằng

npm install -g ganache-cli
0 trong lệnh trên và thử chạy lại. Chúng tôi cần ít nhất phiên bản
npm install -g ganache-cli
1 để chạy Brownie

Khi Python được cài đặt, chúng tôi đã sẵn sàng để cài đặt pipx. Pipx là công cụ giúp bạn cài đặt và chạy ứng dụng Python trong môi trường biệt lập. Nó làm cho việc chạy và nâng cấp Brownie dễ dàng hơn nhiều so với việc chúng ta sử dụng pip thông thường

Để cài đặt pipx

python -m pip install --user pipx
python -m pipx ensurepath

Bạn có thể cần phải khởi động lại cửa sổ đầu cuối của mình sau khi cài đặt pipx, để các đường dẫn được cập nhật có hiệu lực

Cài đặt bánh hạnh nhân

Cuối cùng chúng ta cũng ở đó. Với tất cả các phụ thuộc cần thiết, đã đến lúc cài đặt Brownie 😎 Nhập lệnh sau vào thiết bị đầu cuối của bạn

pipx install eth-brownie

Có thể mất một hoặc hai phút khi pipx cài đặt tất cả các gói python cần thiết. Sau khi cài đặt xong, hãy xác nhận rằng mọi thứ đã hoạt động

________số 8_______

Bạn sẽ thấy một cái gì đó như thế này

Chúng tôi đang kinh doanh. Chúc mừng bạn đã hoàn thành tốt công việc

Khi bạn đã sẵn sàng, bạn có thể tiếp tục với Phần thứ hai, nơi chúng ta sẽ tạo một dự án mới và làm quen với một số chức năng chính của Brownie

Bạn cũng có thể theo dõi tài khoản Twitter của Brownie, đọc các bài viết khác trên Phương tiện của chúng tôi và tham gia cùng chúng tôi trên Gitter

Bạn có biết bạn có thể sử dụng solidity với Python không?

Nếu những câu hỏi này xuất hiện trong đầu bạn, thì bạn đã đến đúng nơi. Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách bạn có thể triển khai hợp đồng Solidity của mình với Python và cả cách tương tác với hợp đồng. Trước tiên, chúng tôi sẽ xây dựng một hợp đồng Solidity đơn giản trước khi triển khai nó bằng Python và sau đó tương tác với nó

Trong khi làm việc với Solidity cục bộ, bạn có thể muốn thử nghiệm và tương tác với hợp đồng thông minh của mình, bạn có thể sử dụng công cụ có tên là Web3. py

điều kiện tiên quyết
  • Hiểu biết cơ bản về Python
  • Hiểu biết cơ bản về Solidity và Ethereum Blockchain
Phát triển một hợp đồng Solidity đơn giản

Chúng tôi sẽ xây dựng một hợp đồng lưu trữ người dùng và số điện thoại của họ, tôi. e. một hợp đồng danh sách liên lạc. Đây không phải là lý tưởng, nhưng chúng tôi chỉ cần thứ gì đó mà chúng tôi có thể sử dụng để thử nghiệm triển khai của mình

Để thực hiện điều này, chúng ta chỉ cần khởi tạo một mảng tên liên hệ và số điện thoại, ánh xạ chúng lại với nhau, nối liên hệ vào mảng liên hệ sau đó viết một câu lệnh để cho phép chúng tôi lấy số điện thoại từ tên liên hệ

Để bắt đầu, hãy tạo một tệp Solidity mới cho dự án của bạn, trong trường hợp của tôi, đó sẽ là Danh sách liên hệ. sol. Bây giờ dán mã bên dưới vào tệp bạn vừa tạo. Tôi đã thêm nhận xét để mô tả những gì mỗi dòng đang làm

// SPDX-License-Identifier: MITpragma solidity 0.8.0;contract ContactList {    // uint phoneNumber;
uint256 phoneNumber;
struct Contact {
// assosiate name with phone number
string name;
string phoneNumber;

}
Contact[] public contact; //array for list of contacts
mapping(string => string) public nameToPhoneNumber; //used to map name to phone number, so you can get phone number using name

function retrieve() public view returns (Contact[] memory){
return contact; //retrieve tuple of all contacts
}

function addContact(string memory _name, string memory _phoneNumber) public {
contact.push(Contact(_name, _phoneNumber)); //append to Contact[] array
nameToPhoneNumber[_name] = _phoneNumber; //use name to get phone number
}

}

Bạn có thể kiểm tra hợp đồng trên Remix để xem liệu nó có hoạt động như dự kiến ​​hay không trước khi tiến xa hơn trong quy trình

Triển khai hợp đồng thông minh Solidity với Python

Bây giờ chúng ta đang ở phần Python của bài viết này. Để triển khai, những gì chúng ta có thể làm là đọc tệp Solidity, biên dịch nó, thay đổi hợp đồng thành Python, xây dựng hợp đồng, ký hợp đồng và gửi hợp đồng

Để bắt đầu, hãy tạo một tệp Python mới trong cùng thư mục mà bạn có tệp Solidity (triển khai. py). Tiếp theo, dán đoạn mã sau để đọc tệp Solidity

with open("ContactList.sol", "r") as file:
contact_list_file = file.read()

Bây giờ chúng ta phải biên dịch mã Solidity chỉ bằng cách đọc. Chúng tôi sẽ làm điều đó với py-solc-x. Đầu tiên cài đặt thư viện bằng cách chạy

with open("ContactList.sol", "r") as file:
contact_list_file = file.read()
0. Từ py-solc-x, chúng ta cần các phương thức
with open("ContactList.sol", "r") as file:
contact_list_file = file.read()
1 và
with open("ContactList.sol", "r") as file:
contact_list_file = file.read()
2 để biên dịch. Nhập các phương thức bằng cách dán
with open("ContactList.sol", "r") as file:
contact_list_file = file.read()
3 ở đầu tệp Python của bạn

Để biên dịch với

with open("ContactList.sol", "r") as file:
contact_list_file = file.read()
1, bạn cần nêu một số tham số, như bạn có thể thấy trong đoạn mã bên dưới

import json #to save the output in a JSON file
...
compiled_sol = compile_standard(
{
"language": "Solidity",
"sources": {"ContactList.sol": {"content": contact_list_file}},
"settings": {
"outputSelection": {
"*": {
"*": ["abi", "metadata", "evm.bytecode", "evm.bytecode.sourceMap"] # output needed to interact with and deploy contract
}
}
},
},
solc_version="0.8.0",
)
print(compiled_sol)
with open("compiled_code.json", "w") as file:
json.dump(compiled_sol, file)

Bây giờ, hãy chạy mã bạn có và bạn nhận thấy rằng đầu ra đã được kết xuất trong compile_code. json. Chúng ta cần duyệt qua JSON để lấy ABI và mã byte, vì vậy sẽ rất hữu ích khi duyệt qua đầu ra JSON. Để giải nén ABI và mã byte, hãy dán đoạn mã sau vào bên dưới mã mà bạn có

# get bytecode
bytecode = compiled_sol["contracts"]["ContactList.sol"]["ContactList"]["evm"]["bytecode"]["object"]
# get abi
abi = json.loads(compiled_sol["contracts"]["ContactList.sol"]["ContactList"]["metadata"])["output"]["abi"]
Sử dụng Ganache làm Chuỗi khối

Để triển khai hợp đồng của chúng tôi, chúng tôi cần một chuỗi khối. Ganache CLI cung cấp một chuỗi khối mô phỏng mà bạn có thể sử dụng để kiểm tra mọi thứ khi triển khai. Để sử dụng Ganache, chúng tôi cần một công cụ giúp chúng tôi tạo hợp đồng bằng Python, đây là nơi Web3. py đến

Bạn có thể cài đặt Web3. py bằng cách chạy và bạn có thể kiểm tra trang gói Ganache CLI để nhận hướng dẫn về cách cài đặt nó

Chúng tôi cần một số thứ từ Ganache để tạo Máy chủ RPC hợp đồng, ID chuỗi (

with open("ContactList.sol", "r") as file:
contact_list_file = file.read()
5 cho Ganache), địa chỉ và khóa riêng. Bạn có thể lấy thông tin đăng nhập bằng cách chạy
with open("ContactList.sol", "r") as file:
contact_list_file = file.read()
6. Chạy lệnh sẽ kích hoạt máy chủ với thông tin đăng nhập cần thiết

Bây giờ dán đoạn mã sau vào triển khai của bạn. tập tin py. So sánh thông tin đăng nhập trong mã với hình ảnh ở trên để xem mọi thứ phù hợp ở đâu

...
from web3 import Web3
...
# For connecting to ganache
w3 = Web3(Web3.HTTPProvider(""))
chain_id = 1337
address = "0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1"
private_key = "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d" # leaving the private key like this is very insecure if you are working on real world project
# Create the contract in Python
ContactList = w3.eth.contract(abi=abi, bytecode=bytecode)
# Get the number of latest transaction
nonce = w3.eth.getTransactionCount(address)

Bây giờ, để hoàn thành việc triển khai, chúng tôi phải xây dựng, ký và gửi các giao dịch (thay đổi trạng thái của chuỗi khối) tới Ganache. Để thực hiện việc này, hãy dán đoạn mã sau vào phần triển khai của bạn. tập tin py

Ghi chú. Ganache là công cụ có ganache CLI là giao diện dòng lệnh cho Ganache

# build transaction
transaction = ContactList.constructor().buildTransaction(
{
"chainId": chain_id,
"gasPrice": w3.eth.gas_price,
"from": address,
"nonce": nonce,
}
)
# Sign the transaction
sign_transaction = w3.eth.account.sign_transaction(transaction, private_key=private_key)
print("Deploying Contract!")
# Send the transaction
transaction_hash = w3.eth.send_raw_transaction(sign_transaction.rawTransaction)
# Wait for the transaction to be mined, and get the transaction receipt
print("Waiting for transaction to finish...")
transaction_receipt = w3.eth.wait_for_transaction_receipt(transaction_hash)
print(f"Done! Contract deployed to {transaction_receipt.contractAddress}")

Bây giờ chúng tôi đã thiết lập mọi thứ, bây giờ bạn có thể triển khai hợp đồng của mình bằng cách chạy mã Python của bạn. Đảm bảo máy chủ Ganache của bạn vẫn hoạt động, nếu không nó sẽ không hoạt động

Truy cập máy chủ Ganache của bạn và bạn sẽ thấy rằng chúng tôi đã triển khai một giao dịch và chúng tôi đã tạo hợp đồng

Tương tác với Hợp đồng

Hai cách để tương tác với một hợp đồng với

with open("ContactList.sol", "r") as file:
contact_list_file = file.read()
7 (gọi một hàm và nhận giá trị trả về) và
with open("ContactList.sol", "r") as file:
contact_list_file = file.read()
8 (thực hiện các thay đổi trong hợp đồng)

Khi cố gắng tương tác với hợp đồng, bạn cần có địa chỉ hợp đồng và ABI của hợp đồng. Chúng tôi đã nhận được ABI sớm hơn, nhưng chúng tôi có thể lấy địa chỉ hợp đồng cho

with open("ContactList.sol", "r") as file:
contact_list_file = file.read()
9 như bạn sẽ thấy trong mã bên dưới. Thêm đoạn mã sau bên dưới những gì bạn có trong quá trình triển khai của mình. py để khởi tạo hợp đồng của chúng tôi với địa chỉ hợp đồng và ABI

contact_list = w3.eth.contract(address=transaction_receipt.contractAddress, abi=abi)

Bây giờ bạn có thể tạo hợp đồng bằng cách dán mã bên dưới, trong mã bên dưới, bạn chỉ cần thêm một liên hệ

store_contact = contact_list.functions.addContact(
"name", "+2348112398610"
).buildTransaction({"chainId": chain_id, "from": address, "gasPrice": w3.eth.gas_price, "nonce": nonce + 1})

Bây giờ hãy ký, gửi và chờ giao dịch kết thúc

# Sign the transaction
sign_store_contact = w3.eth.account.sign_transaction(
store_contact, private_key=private_key
)
# Send the transaction
send_store_contact = w3.eth.send_raw_transaction(sign_store_contact.rawTransaction)
transaction_receipt = w3.eth.wait_for_transaction_receipt(send_store_contact)

Bây giờ bạn có thể truy xuất hợp đồng bằng hàm

with open("ContactList.sol", "r") as file:
contact_list_file = file.read()
7

print(contact_list.functions.retrieve().call())

Bây giờ hãy chạy mã với

import json #to save the output in a JSON file
...
compiled_sol = compile_standard(
{
"language": "Solidity",
"sources": {"ContactList.sol": {"content": contact_list_file}},
"settings": {
"outputSelection": {
"*": {
"*": ["abi", "metadata", "evm.bytecode", "evm.bytecode.sourceMap"] # output needed to interact with and deploy contract
}
}
},
},
solc_version="0.8.0",
)
print(compiled_sol)
with open("compiled_code.json", "w") as file:
json.dump(compiled_sol, file)
1, và bạn sẽ thấy một cái gì đó giống như hình bên dưới. Điều này cho thấy rằng chúng tôi đã lưu thành công số liên lạc và chúng tôi có thể truy xuất số liên lạc

Phần kết luận

Trong hướng dẫn này, chúng ta đã có thể xây dựng Hợp đồng đơn giản trong Solidity và nhận dữ liệu cần thiết để xây dựng hợp đồng bằng Python bằng py-solx. Sau đó, chúng tôi đã tiến xa hơn để chuyển đổi hợp đồng Solidity thành Python rồi xây dựng, ký và gửi giao dịch tới Ganache bằng Web3. py

Ganache không phải là một chuỗi khối thực sự, vì vậy vui lòng không bỏ tiền thật vào đó, chúng tôi chỉ sử dụng nó để kiểm tra mọi thứ tại địa phương