Khóa công khai python để giải quyết

Thư viện Python cho chữ ký và giao dịch tiền điện tử. Chúng tôi có thể đảm bảo cài đặt của nó bằng cách sử dụng

pip cài đặt tiền điện tử

 Thư viện này giúp và hỗ trợ tạo và đẩy các giao dịch thô cho.

  • mạng chính bitcoin
  • mạng thử nghiệm bitcoin
  • Mạng chính Bitcoin Cash (có bảo vệ phát lại)
  • Bitcoin Cash testnet (có bảo vệ phát lại)
  • Mạng chính Litecoin
  • Mạng thử nghiệm Litecoin
  • Mạng chính Dash
  • mạng thử nghiệm Dash
  • Mạng chính Dogecoin
  • Mạng chính Bitcoin Gold (có bảo vệ phát lại)

Sự miêu tả

Có một số ưu điểm và nhược điểm của thư viện pybitcointools

Thuận lợi

  • Các phương thức có giao diện dễ dàng và đơn giản, nhập và xuất ở định dạng tiêu chuẩn
  • Các lớp cho các loại tiền khác nhau với giao diện chung
  • Nhiều chức năng có thể được lấy ra và sử dụng riêng lẻ
  • Hỗ trợ nhị phân, hex và base58
  • Định dạng deserialization giao dịch gần như tương thích với BitcoinJS
  • Hỗ trợ Electrum và BIP0032
  • Tạo và xuất bản tất cả giao dịch trong một hướng dẫn dòng lệnh duy nhất với toàn quyền kiểm soát
  • Bao gồm các tiện ích JSON và chuyển đổi không dành riêng cho bitcoin

Nhược điểm

  • Đây không phải là nút đầy đủ, không biết khối là gì
  • Dựa vào các trình khám phá tập trung cho các hoạt động chuỗi khối

Phương trình đường cong elip của bitcoin

                                y 2  mod p = (x 3  +

Trong phương trình này p là hằng số nguyên tố và giá trị là 2 256  – 2 32< – 29 – 28 – 27 – 26 – 24 – 1

Khóa công khai là K = k * G

Trong đó G là điểm tạo trên đường cong elip được chỉ định bằng Bitcoin. K là khóa riêng tư và khóa chung được tính toán cũng là một điểm trên đường cong, là điểm khóa chung  (x, y ). Khóa công khai thông thường là trực tiếp 04xy. Bằng cách này, '04', hệ thập lục phân của x và hệ thập lục phân của y, được đặt trực tiếp với nhau

Cách nén khóa công khai

Vì khóa chung là một điểm trên đường cong elip. Chỉ bản ghi x và y có thể được tính theo phương trình. Y trong trường số thực 2  sẽ nhận được cặp nghiệm trái dấu. Bằng một trường hữu hạn dựa trên lũy thừa nguyên tố p, y 2  sẽ thu được hai nghiệm có số chẵn lẻ khác nhau. Ta cần đánh dấu để biết giá trị y của điểm K ban đầu là.

Giả sử rằng tọa độ khóa chung là (x, y), địa chỉ khóa chung chung là 04xy và địa chỉ khóa chung được nén là 02x hoặc 03x

PHP rất phổ biến trong việc phát triển phần phụ trợ của các trang web hoặc ứng dụng web. PHP có rất nhiều nhà phát triển tin tưởng nó là ngôn ngữ tiếp theo của họ. Trong hướng dẫn này, chúng ta sẽ xem làm thế nào chúng ta có thể

Khóa công khai python để giải quyết

Tôi đã tự hỏi sẽ mất bao lâu để tạo tất cả các khóa riêng Ethereum có địa chỉ trên máy tính xách tay của mình

Tôi biết phải làm điều này trong một khung thời gian hợp lý, ngay cả trên một máy tính giàu trí tưởng tượng sẽ sử dụng mức năng lượng tối thiểu nhất có thể. Đây là một trải nghiệm học tập nhiều hơn đối với tôi để tìm hiểu thêm về hàm băm SHA-3 và KECCAK, đường cong ECDSA, Khóa công khai và địa chỉ Ethereum

Do trình thông dịch chậm, Python thường không phải là một lựa chọn tốt khi viết các ứng dụng hiệu quả. Ngoại lệ là các mô-đun Python sử dụng giao diện gọi mã C/C++. Các mô-đun này thường rất nhanh, ví dụ phổ biến là Tensorflow và Numpy. Để tạo địa chỉ Ethereum, chúng ta có thể sử dụng hai mô-đun Python sau, cả hai đều dựa trên C và có hiệu suất tốt

  • đồng xu. Liên kết Python CFFI đa nền tảng cho libsecp256k1
  • pysha3. Trình bao bọc SHA-3 cho Python (có hỗ trợ keccak)

Tạo địa chỉ Ethereum là một quy trình gồm 3 bước

  1. Tạo khóa riêng
  2. Lấy khóa công khai từ khóa riêng
  3. Lấy địa chỉ Ethereum từ khóa công khai

Lưu ý rằng khóa công khai và địa chỉ Ethereum không giống nhau. Địa chỉ là giá trị băm của khóa công khai. Không thể gửi tiền đến khóa công khai

Bước 1. Tạo khóa riêng

Khóa riêng của Ethereum dựa trên hàm băm KECCAK-256. Để tạo hàm băm như vậy, chúng tôi sử dụng hàm keccak_256 từ mô-đun pysha3 trên hạt giống 32 byte ngẫu nhiên

import secrets
from sha3 import keccak_256

private_key = keccak_256(secrets.token_bytes(32)).digest()

Lưu ý rằng hàm băm KECCAK không giống với hàm băm SHA-3. KECCAK đã giành chiến thắng trong một cuộc thi để trở thành tiêu chuẩn SHA-3 nhưng đã được sửa đổi một chút trước khi nó trở thành tiêu chuẩn. Một số thư viện SHA3 như pysha3 bao gồm thuật toán KECCAK kế thừa trong khi các thư viện khác, chẳng hạn như mô-đun hashlib Python, chỉ triển khai tiêu chuẩn SHA-3 chính thức

Bước 2. Lấy khóa công khai từ khóa riêng

Để lấy khóa công khai, chúng tôi cần ký khóa riêng của mình bằng Thuật toán chữ ký số Elliptic Curve (ECDSA). Ethereum sử dụng đường cong secp256k1 ECDSA. Coincurve sử dụng điều này làm mặc định, vì vậy chúng tôi không cần chỉ định rõ ràng khi gọi hàm

from coincurve import PublicKey

public_key = PublicKey.from_valid_secret(private_key).format(compressed=False)[1:]

Ethereum Yellow Paper nói rằng khóa chung phải là một mảng byte có kích thước 64

Theo mặc định, coincurve sử dụng định dạng nén cho các khóa công khai (libsecp256k1 được phát triển cho Bitcoin, nơi các khóa nén thường được sử dụng) có kích thước 33 byte. Các khóa không nén có kích thước 65 byte. Ngoài ra, tất cả các khóa công khai đều được thêm vào trước một byte để cho biết chúng được nén hay không nén. Điều này có nghĩa là trước tiên chúng tôi cần lấy khóa 65 byte không nén (compressed=False) và sau đó loại bỏ byte đầu tiên (_______6_______) để lấy khóa công khai Ethereum 64 byte của chúng tôi

Bước 3. Lấy địa chỉ Ethereum từ khóa công khai

Bây giờ chúng ta có thể tạo địa chỉ Ethereum của mình

addr = keccak_256(public_key).digest()[-20:]

Như được chỉ định trong Sách vàng, chúng tôi lấy tối đa 20 byte bên phải của hàm băm KECCAK 32 byte của khóa công khai ECDSA tương ứng

Ví dụ đầy đủ

Đây là mã ví dụ đầy đủ từ các bước trên. Nó tạo một khóa riêng ngẫu nhiên, lấy địa chỉ và in chúng ở định dạng hex

from secrets import token_bytes
from coincurve import PublicKey
from sha3 import keccak_256

private_key = keccak_256(token_bytes(32)).digest()
public_key = PublicKey.from_valid_secret(private_key).format(compressed=False)[1:]
addr = keccak_256(public_key).digest()[-20:]

print('private_key:', private_key.hex())
print('eth addr: 0x' + addr.hex())

### Output ###
# private_key: 7bf19806aa6d5b31d7b7ea9e833c202e51ff8ee6311df6a036f0261f216f09ef
# eth addr: 0x3db763bbbb1ac900eb2eb8b106218f85f9f64a13

Phần kết luận

Tôi đã sử dụng mô-đun Python timeit để thực hiện điểm chuẩn nhanh với đoạn mã trên. Kết quả là máy tính xách tay của tôi có thể tạo 18 nghìn địa chỉ mỗi giây trên một lõi cpu. Sử dụng tất cả 4 lõi cpu có 72k địa chỉ mỗi giây, ~6. 2 tỷ (6. 220. 800. 000) địa chỉ mỗi ngày hoặc khoảng hai nghìn tỷ (2. 270. 592. 000. 000) địa chỉ mỗi năm

Không gian địa chỉ của Ethereum là 2^160. Điều này có nghĩa là bằng cách sử dụng phương pháp này, nó sẽ lấy máy tính xách tay của tôi 643665439999999976814879449351716864 (sáu trăm bốn mươi ba decillion. ) năm để tạo tất cả các khóa riêng Ethereum có địa chỉ