High Level
, Statically typed
, Object-oriented
ngôn ngữ lập trình lấy cảm hứng từ C++, JavaScript và Python. Đây là một trong những ngôn ngữ lập trình được phát triển gần đây, đang ở giai đoạn sơ khai [kể từ tháng 1 năm 2022] có phiên bản hiện tại là 0. 8. 11. Bạn luôn có thể kiểm tra phiên bản mới nhất tại đây. Bạn có thể sử dụng solidity để viết hợp đồng thông minh [đơn giản là mã được viết bằng solidity] cho chuỗi khối Ethereum
hoặc bất kỳ chuỗi khối tương thích nào khác, chẳng hạn như Binance Smart Chain
[BSC], Ethereum Classic
, Tron
, Avalanche
, Dapps
0 và một số chuỗi khối khác 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
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 PythonBâ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ướiimport 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 đoạn 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 bytecodeSử dụng Ganache làm Chuỗi khối
bytecode = compiled_sol["contracts"]["ContactList.sol"]["ContactList"]["evm"]["bytecode"]["object"]# get abi
abi = json.loads[compiled_sol["contracts"]["ContactList.sol"]["ContactList"]["metadata"]]["output"]["abi"]
Để 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 xác thực cần thiếtBâ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à ABIcontact_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[]
7print[contact_list.functions.retrieve[].call[]]
Bây giờ hãy chạy mã với
import json #to save the output in a JSON file1, 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
...
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]
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