Bạn có thể sử dụng python cho ethereum không?

Lưu trữ dữ liệu trong cơ sở dữ liệu là một phần không thể thiếu của bất kỳ ứng dụng phần mềm nào. Bất cứ ai có quyền kiểm soát cơ sở dữ liệu đó là chủ của dữ liệu đó. Công nghệ chuỗi khối lưu trữ dữ liệu vào khối bên trong mạng chuỗi khối. Vì vậy, bất cứ khi nào một số nút đồng bộ hóa với mạng, chúng sẽ nhận được bản sao dữ liệu trong khối. Vì vậy, không có chủ cụ thể của dữ liệu trong công nghệ này

 

Trong hướng dẫn này, chúng tôi sẽ viết một hợp đồng thông minh [tôi sẽ giải thích thêm về điều này] để duy trì dữ liệu người dùng trên chuỗi khối. Chúng tôi sẽ sử dụng python web3 [thư viện python cho web3] để tạo và triển khai hợp đồng thông minh. Khi chúng tôi đã triển khai hợp đồng thông minh trên blockchain. Chúng ta sẽ tương tác với hợp đồng thông minh bằng cách sử dụng API bình để lưu trữ một số dữ liệu/thông tin. Chúng tôi đang lưu trữ nó trên blockchain để nó không thay đổi

 

 

Yêu cầu

Trăn 3. 6

 

Cài đặt

1. Tạo môi trường ảo python

 

Virtualenv [http. //ảoenv. đọcthedocs. io/en/latest/] giữ các gói Python của bạn trong một môi trường ảo được bản địa hóa cho dự án của bạn, thay vì buộc bạn phải cài đặt các gói của mình trên toàn hệ thống

 

$ virtualenv -p /usr/bin/python3. 6 venv
$ nguồn venv/bin/kích hoạt

2. Bây giờ chúng ta cần chuỗi thử nghiệm ethereum như ganache

 

Ganache [https. //github. com/trufflesuite/ganache-cli/blob/master/README. md] là một chuỗi khối cá nhân để phát triển Ethereum mà bạn có thể sử dụng để triển khai hợp đồng, phát triển ứng dụng của mình và chạy thử nghiệm

 

$ npm cài đặt -g ganache-cli

3. Cài đặt python web3

 

Web3. py [http. //Web3. py] là một thư viện python để tương tác với ethereum. API của nó có nguồn gốc từ Web3. js Javascript và hẳn đã quen thuộc với bất kỳ ai đã sử dụng web3. js

 

$ pip3 cài đặt web3

4. Bình giữ nhiệt

 

bình [http. //bình giữ nhiệt. pocoo. org/] là một microframework cho Python

 

$ pip3 cài đặt bình

5. bình tĩnh

 

Flask-RESTful [https. // bình yên tĩnh. đọcthedocs. io/en/latest/] là một tiện ích mở rộng cho Flask bổ sung hỗ trợ để xây dựng nhanh các API REST

 

$ pip3 cài đặt bình tĩnh

6. kẹo dẻo bình

 

Flask marshmallow là một thư viện tuần tự hóa/giải tuần tự hóa đối tượng

$ pip3 cài đặt bình-marshmallow

 

Khởi động máy chủ chuỗi khối thử nghiệm Ethereum

Để triển khai hợp đồng thông minh, chúng ta nên bắt đầu thử nghiệm máy chủ ethereum. Chúng tôi đang sử dụng ganache để thử nghiệm. Nhập lệnh dưới đây trong thiết bị đầu cuối

 

$ ganache-cli

 

Ganache cung cấp cho chúng tôi 10 tài khoản thử nghiệm mặc định với 100 ether giả trong mỗi tài khoản để giao dịch. Chúng tôi sẽ sử dụng các tài khoản này để triển khai và thiết lập giá trị trong hợp đồng

 

 

Chúng ta có thể thấy giải khí và giới hạn cùng với máy chủ. cổng mà ganache được triển khai. Chúng tôi sẽ cần điều này trong khi triển khai hợp đồng

 

Tạo người dùng. tập tin sol

Bây giờ chúng ta sẽ viết hợp đồng thông minh một cách vững chắc. Solidity là ngôn ngữ để viết hợp đồng thông minh trên ethereum. Hợp đồng thông minh bao gồm dữ liệu mà chúng tôi sẽ lưu trữ trên chuỗi khối với các chức năng xác thực tùy chọn trên dữ liệu và phương thức getter, setter để truy cập dữ liệu

 

Ví dụ: để đăng ký tham dự trên blockchain, bạn sẽ có một mảng đối tượng người dùng. Nó sẽ có phương thức getter, setter để truy cập người dùng. Vì mỗi người dùng chỉ có thể đánh dấu sự tham dự của cô ấy một lần mỗi ngày, nên bạn cần có chức năng xác thực để kiểm tra điều đó. Hợp đồng thông minh rất giống với ứng dụng mà chúng tôi thường phát triển bằng bất kỳ ngôn ngữ nào khác

 

Trong tệp bên dưới, chúng tôi đang xây dựng hợp đồng người dùng đơn giản với các hàm getter, setter

 

1. Khai báo phiên bản trình biên dịch solidity trong. tập tin sol

sự vững chắc thực dụng ^0. 4. 21;

Để biết phiên bản trình biên dịch nào được sử dụng

$ solidity — phiên bản

2. Nhập tệp thư viện. chúng ta nên sử dụng các thư viện cho các chức năng tiện ích phổ biến. Các thư viện chỉ được biên soạn một lần và được sử dụng nhiều lần [bấm vào đây để xem một số tài nguyên thư viện tốt]

nhập “chuỗiUtils. sol”;

3. Khai báo hợp đồng cho người dùng

hợp đồng userRecords {}

4. Bây giờ cho bản demo cơ bản, chúng tôi sẽ lưu trữ thông tin tên và giới tính về người dùng. Vì vậy, hãy khởi tạo hai biến này bằng cách sử dụng kiểu dữ liệu struct và enum

// biến loại enum để lưu trữ giới tính người dùng
enumgiới tínhType { nam, nữ }
// Đối tượng người dùng thực mà chúng tôi sẽ lưu trữ trong ethereum
struct user{
string name; genderType gender;
}

5. Bây giờ chúng ta sẽ khai báo đối tượng user kiểu user[struct]. Bạn cũng có thể khai báo nó là công khai để truy cập nó từ bên ngoài hợp đồng [Đối với phạm vi hiển thị, hãy nhấp vào đây]

người dùng user_obj;

6. Bây giờ thêm các phương thức getter, setter cho đối tượng người dùng. Chúng tôi sẽ duy trì thông tin của mọi người dùng trên blockchain. Chúng ta phải luôn công khai phương thức này vì chúng ta sẽ truy cập chúng từ bên ngoài hợp đồng

// thiết lập chức năng công khai của người dùng
// Điều này tương tự như việc duy trì đối tượng trong db.
hàm setUser[tên chuỗi, giới tính chuỗi] công khai {
genderType giới tính_type = getGenderFromString[giới tính];
user_obj = người dùng[ . Tên / Giới tính. giới tính_type}];
}
// lấy chức năng công khai của người dùng
// Điều này tương tự như lấy đối tượng từ db.
hàm getUser[] trả về công khai [chuỗi, chuỗi] {
return [user_obj. tên, getGenderToString[user_obj. giới tính]];
}

7. Lưu ý rằng chúng tôi đang sử dụng hai hàm trợ giúp nội bộ getGenderFromString[] và getGenderToString[]. Hãy thêm chức năng nội bộ này. Khai báo chúng bên trong vì chúng tôi sẽ không sử dụng chúng bên ngoài

// Hàm nội bộ để chuyển đổi enum giới tính từ chuỗi
hàm getGenderFromString[giới tính chuỗi] trả về nội bộ[genderType] {
if[StringUtils. bằng[giới tính, “nam”]] {
returngiới tínhType. nam;
} other {
returngiới tínhType. nữ;
}
}
// Hàm bên trong để chuyển đổi enum giới tính thành chuỗi
. nam] {
if[gender == genderType.male] {
return “nam”;
} else {
return “nữ”;
}
}

Chúng tôi đang sử dụng stringUtils. Hàm thư viện equal[]. Vì phiên bản solidity này không hỗ trợ so sánh chuỗi bằng cách sử dụng [==]

 

8. Bây giờ hợp đồng của chúng tôi đó là người dùng. tệp sol sẽ giống như bên dưới

sự vững chắc của pragma ^0. 4. 21;
// nhập tệp thư viện
nhập “stringUtils. sol”;
bản ghi người dùng hợp đồng {
// biến kiểu enum để lưu trữ giới tính người dùng
enumgiới tínhType { nam, nữ }; . bằng[giới tính, “nam”]] {
// Actual user object which we will store
struct user{
string name;
genderType gender;
}
// user object
user user_obj;
//Internal function to conver genderType enum from string
function getGenderFromString[string gender] internal returns [genderType] {
if[StringUtils.equal[gender, “male”]] {
returngiới tínhType. nam;
} else {
returngiới tínhType. nữ;
}
}
//Hàm nội bộ để chuyển đổi enum giới tính thành chuỗi
. nam] {
if[gender == genderType.male] {
return “nam”;
} else {
return “nữ”;
}
}
// set user public function
// This is similar to persisting object in db.
function setUser[tên chuỗi, giới tính chuỗi] công khai {
genderType giới tính_type = getGenderFromString[giới tính];
user_obj = người dùng[ . Tên / Giới tính. giới tính_type}];
}// lấy chức năng công khai của người dùng
// Điều này tương tự như lấy đối tượng từ db.
hàm getUser[] trả về công khai [chuỗi, chuỗi] {
return [user_obj. tên, getGenderToString[user_obj. giới tính]];
}
}

 

Biên dịch và triển khai tệp solidity ở trên bằng tập lệnh python

1. Trong tập lệnh python bên dưới, chúng ta cần khởi tạo nút ethereum thử nghiệm bằng python-web3. Chúng tôi đang đặt url ganche làm nút ethereum thử nghiệm. Chúng tôi sẽ sử dụng đối tượng w3 bên dưới để triển khai hợp đồng

từ web3 nhập Web3
# web3. py
w3 = Web3[Web3. Nhà cung cấp HTTP[“http. //127. 0. 0. 1. 8545”]]

2. Bây giờ chúng ta sẽ biên dịch mã solidity. Để biên dịch mã solidity, chúng tôi đang sử dụng py-solc, phần mở rộng python cho trình biên dịch solidity

từ solc nhập compile_files
# biên dịch tất cả các tệp hợp đồng
contracts = compile_files[[‘user. sol', 'stringUtils. sol’]]
# tệp chính riêng biệt và tệp liên kết
main_contract = hợp đồng. pop[“người dùng. sol. userRecords”]
library_link = hợp đồng. pop[“stringUtils. sol. StringUtils”]

3. Bất cứ khi nào bạn biên dịch một. sol với câu lệnh nhập. Chúng tôi cũng cần liên kết địa chỉ triển khai của tệp nhập cùng với hợp đồng chính. Vì vậy, trước tiên hãy triển khai tất cả các liên kết bằng cách biên dịch nó [Nếu đã triển khai rồi thì hãy lưu địa chỉ] Xem hình ảnh bên dưới thùng hợp đồng chính

Khi bạn biên dịch hợp đồng chính của mình và nếu bạn thấy phần bin của nó, bạn sẽ tìm thấy “_stringUtils. sol. StringUtils___________” cho thư viện [cũng có thể cho hợp đồng] mà chúng tôi đang nhập. Phần này chúng ta nên thay thế bằng địa chỉ thư viện bằng cách triển khai nó trước khi ký hợp đồng

4. Sau đó, chúng tôi sẽ liên kết địa chỉ thư viện với hợp đồng chính

từ solc nhập link_code
def triển khai_hợp đồng [giao diện hợp đồng].
# Khởi tạo và triển khai hợp đồng
hợp đồng = w3. đạo đức. hợp đồng[
abi=contract_interface['abi'],
bytecode=contract_interface['bin']
]
# Get transaction hash from deployed contract
tx_hash = contract.deploy[
giao dịch={'từ'. w3. đạo đức. tài khoản[1]}
]
# Nhận biên lai tx để nhận địa chỉ hợp đồng
tx_receipt = w3. đạo đức. getTransactionReceipt[tx_hash]
return tx_receipt[‘contractAddress’]
library_address = {
“stringUtils. sol. StringUtils”. Deploy_contract[library_link]
}
main_contract['bin'] = link_code[
main_contract['bin'], library_address

Chủ Đề