Solidity có dựa trên Python không?

Solidity là High LevelStatically typedObject-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 ClassicTronAvalancheDapps0 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
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 đ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 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 xác thực 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

Python và Solidity có giống nhau không?

Solidity là ngôn ngữ lập trình cấp cao và hướng đối tượng để xây dựng hợp đồng thông minh trên chuỗi khối Ethereum và các mạng chuỗi khối khác như BNB Smart Chain và Avalanche. Ngôn ngữ này được phát triển vào năm 2014 và có những điểm tương đồng với các ngôn ngữ lập trình như JavaScript, C++ và Python .

Python có cần học Solidity không?

Solidity thân thiện với người dùng đối với bất kỳ ai có kiến ​​thức cơ bản về các ngôn ngữ lập trình khác như Python, C++ và Java . Các chuyên gia có kinh nghiệm về khái niệm lập trình và ngôn ngữ lập trình thường có thể học Solidity sau 1-6 tháng. Nếu bạn không có kinh nghiệm lập trình, có thể mất nhiều thời gian hơn.

Solidity dựa trên cái gì?

Solidity là ngôn ngữ lập trình được nhập tĩnh được thiết kế để phát triển các hợp đồng thông minh chạy trên Máy ảo Ethereum [EVM]. Solidity sử dụng cú pháp giống như ECMAScript khiến nó trở nên quen thuộc với các nhà phát triển web hiện có; .

Ngôn ngữ nào được sử dụng cho Solidity?

Solidity là ngôn ngữ lập trình hướng đối tượng được nhóm Mạng Ethereum tạo riêng để xây dựng và thiết kế hợp đồng thông minh trên nền tảng Chuỗi khối.

Chủ Đề