Giữ khóa trading và secret của ứng dụng ngoài ổ đĩa của server

erpc worker lưu khóa trading và các secret của ứng dụng trong 1Password, chuỗi khóa của bạn hoặc một keystore mã hóa, và giao chúng cho ứng dụng trong bộ nhớ, không bao giờ ghi ra ổ đĩa của server.
Trang này mô tả ERPC CLI v0.1.0-rc.4, một bản pre-release.

Khóa trading đến với ứng dụng như thế nào

Một ứng dụng có ví nhận khóa của nó qua một pipe khi khởi động. Không có wallet.json, không có .env và không có bản sao nào trên server. erpc không ghi khóa ở dạng chưa mã hóa ra bất kỳ ổ đĩa nào: tệp duy nhất mà nó đặt khóa vào là tệp của keystore, trên máy của bạn, được mã hóa bằng cụm mật khẩu của bạn.
  • Nơi lưu khóa: erpc worker key new tạo khóa trong 1Password khi erpc login lưu phiên ở đó, nếu không thì trong chuỗi khóa, nếu không nữa thì trong keystore. erpc.toml ghi lại tham chiếu của khóa và khóa công khai của nó.
  • Trên server: agent của erpc worker chỉ giữ khóa trong bộ nhớ. Agent tự đặt mình ở trạng thái không thể dump và khóa bộ nhớ của mình lại, rồi giao khóa cho ứng dụng trên một file descriptor; ứng dụng xóa sạch khóa sau khi đọc.
  • Sau khi khởi động lại máy, worker trở lại ở trạng thái bị khóa: ứng dụng không chạy cho đến khi erpc worker start gửi lại khóa. Một agent bị lỗi hoặc bị kill sẽ được systemd khởi động lại và cũng trở lại ở trạng thái bị khóa như vậy.
  • Một lần cập nhật package không khởi động lại worker. deploy yêu cầu needrestart để yên các unit của worker: ở chế độ tự động, nó hoãn các unit này, và khi được hỏi ở terminal, câu trả lời mặc định của nó cho các unit này là không, nên một bản cập nhật bảo mật chạy không người giám sát sẽ không khởi động lại ứng dụng. Khi quy tắc đó không ghi được, lần triển khai sẽ thông báo điều đó và tiếp tục, và khi đó worker chạy mà không có sự bảo vệ này.
Khóa trading được chỉ định bởi [wallet] và không bởi thứ gì khác, và erpc chỉ đọc nó khi có người ở terminal: không đọc cho công cụ AI, và không đọc bằng tài khoản dịch vụ 1Password. Một dòng [secrets] chỉ đến tham chiếu của [wallet], hoặc một tài khoản keychain: hay keystore: có tên kết thúc bằng .wallet, sẽ bị từ chối. Trong keystore, một mục được lưu dưới dạng khóa sẽ không mở được như một secret. Trong 1Password, và dưới một tài khoản chuỗi khóa có tên khác, không có gì đánh dấu một khóa: một erpc.toml không có [wallet] mà chỉ định một item như vậy dưới [secrets] sẽ khiến item đó bị đọc như một secret.

Chọn nơi lưu giá trị

1Password không bắt buộc. erpc worker key new và erpc worker secret put lưu những gì chúng nhận được vào nơi đầu tiên áp dụng được trong danh sách sau, trừ khi --store chỉ định một nơi (--store 1password --vault <id>, --store keychain, --store keystore):
  1. 1Password, khi erpc login lưu phiên ở đó hoặc khi có --vault.
  2. Chuỗi khóa của hệ điều hành, trên các hệ thống mà chuỗi khóa giữ được giá trị sau khi khởi động lại: macOS, Windows, và Linux có keyring desktop trong một phiên đã đăng nhập.
  3. Keystore của erpc, trên một máy Linux không có keyring như vậy: server headless, WSL, một phiên đăng nhập SSH. --store keychain trên máy như vậy sẽ bị từ chối.
Trong chuỗi khóa hoặc keystore, khóa chỉ tồn tại trên đúng một máy đó, không có bản sao và không đồng bộ, và máy khác không thể đọc tham chiếu keychain: hay keystore:.
Mất máy hoặc máy bị xóa sạch nghĩa là ví cũng mất: hãy giữ ít tài sản trong ví, hoặc dùng 1Password, nơi mọi máy đã đăng nhập vào vault đều đọc được. Đăng nhập 1Password bằng erpc login --store 1password-desktop, hoặc qua op signin ở nơi không có ứng dụng desktop.
Một tài khoản dịch vụ 1Password có thể giữ các secret của ứng dụng, nhưng erpc không đọc khóa trading bằng tài khoản đó. Với 1Password, mỗi lần đọc có thể hiện một lời nhắc phê duyệt trong ứng dụng 1Password, và erpc hiển thị một spinner trong khi chờ.

Lưu một secret

Các secret, như token API và khóa RPC, được lưu theo cùng cách, nhưng đến ứng dụng dưới dạng biến môi trường, không qua pipe. erpc worker secret put <NAME> lưu giá trị, và [secrets] trong erpc.toml chỉ giữ tham chiếu của nó.
bash
erpc worker secret put API_TOKEN --generate          # the bot's own API token, made for you and shown to nobody
erpc worker secret put ERPC_API_KEY --from-account   # the account's RPC key, read from your account (or SOLANA_RPC_ENDPOINT in [vars])
  • --generate tạo giá trị: 32 byte ngẫu nhiên, dưới dạng 64 ký tự thập lục phân.
  • --from-account lưu khóa RPC đầu tiên của tài khoản mà RPC dùng chung chấp nhận. Các khóa được thử theo thứ tự, khóa chính trước tiên, mỗi khóa một lần gọi getHealth, với 8 giây để phản hồi. Khóa nhận phản hồi 401 hoặc 403 sẽ bị từ chối và khóa tiếp theo được thử, và chỉ khóa mà RPC chấp nhận mới được lưu. Lệnh cho biết đó là khóa chính của tài khoản hay một khóa khác (account_key với --json).
  • Cả hai giá trị đều không được in ra, kể cả với --json. Lần đầu dùng keystore, hoặc khi keystore đang bị khóa, cần có người ở terminal.
  • Các khóa được thử từ máy này, nên một khóa bị giới hạn theo địa chỉ của server sẽ bị từ chối ở đây dù nó hoạt động ở đó. Khi mọi khóa đều bị từ chối, --from-account không lưu gì, và bạn tự lưu khóa mình muốn bằng tay, nhập ẩn hoặc truyền qua pipe. Khi không truy vấn được RPC, lệnh không lưu gì và erpc.toml giữ nguyên như trước; hãy chạy lại cùng lệnh đó.
Để lưu một khóa bằng tay:
bash
erpc worker secret put ERPC_API_KEY        # asks for the value, unseen
  • --replace lưu giá trị mới cho một tên đã được đặt. erpc worker secret list liệt kê các thiết lập secret theo tên và nơi lưu từng thiết lập.
  • Một thiết lập do đường truyền dữ liệu cung cấp (GRPC_ENDPOINT, SHREDS_ENDPOINT, SOLANA_SEND_RPC_ENDPOINT) không bao giờ là secret: --grpc, --shreds và --unlimited đặt nó.
Một tham chiếu trong [secrets] hoặc [wallet] có một trong các dạng sau:
Tham chiếuGiá trị nằm ở đâu
op://<vault-id>/<item-id>/<field>1Password, theo id của vault và item
keychain:<service>/<account>Chuỗi khóa của hệ điều hành trên máy đã lưu giá trị
keystore:<service>/<account>Keystore của erpc trên máy đã lưu giá trị

Keystore

Keystore là thư mục ~/.erpc/keystore (keystore dưới ERPC_HOME khi biến này được đặt). Trên Linux và macOS, các thư mục của nó có quyền 0700 và các tệp có quyền 0600; trên Windows, erpc không tự đặt quyền nào.
  • master.json giữ một khóa master ngẫu nhiên 32 byte, được niêm phong bằng một khóa mà PBKDF2-HMAC-SHA256 (600.000 vòng lặp) tạo ra từ cụm mật khẩu của bạn. Mỗi mục giữ một giá trị, được niêm phong bằng ChaCha20-Poly1305 với một khóa riêng.
  • Cụm mật khẩu: lần key new hoặc secret put đầu tiên dùng keystore sẽ yêu cầu bạn chọn nó, nhập hai lần ở terminal, từ 12 ký tự trở lên. erpc chỉ nhận nó từ lời nhắc ẩn đó, không bao giờ từ một đối số, một biến môi trường hay một pipe.
  • Mở khóa trên Linux: khi cụm mật khẩu đã mở keystore, trạng thái mở khóa được giữ trong keyring bền vững của kernel, trong bộ nhớ, cho đến khi máy khởi động lại, keyring không được dùng quá thời gian hết hạn khi nhàn rỗi (ba ngày, trừ khi hệ thống quy định khác), hoặc cho đến khi chạy erpc worker secret lock. erpc worker secret unlock hỏi cụm mật khẩu trước và cho biết trạng thái mở khóa kéo dài đến khi nào. Trong một shell được khởi động mà không có lần đăng nhập riêng (su không có -, sudo -E), không có trạng thái mở khóa nào được giữ và mỗi lệnh đều hỏi.
  • Khi không có ai ở terminal, một lệnh cần keystore sẽ dùng trạng thái mở khóa nếu có, và nếu không thì thất bại, kèm tên lệnh erpc worker secret unlock. Một keystore đã mở khóa giao ra các secret, không giao khóa trading.
  • Trên macOS và Windows (--store keystore), không có trạng thái mở khóa nào được giữ: mỗi lệnh cần keystore hỏi cụm mật khẩu một lần, nên cần có terminal.

Những gì keystore bảo vệ và không bảo vệ

  • Hãy sao lưu thư mục keystore và nhớ cụm mật khẩu. erpc không thể khôi phục cái nào trong hai thứ đó, và nếu không có đủ cả hai, những gì keystore lưu giữ sẽ mất.
  • Ai có các tệp keystore và cụm mật khẩu thì có khóa. PBKDF2 làm mỗi lần đoán trở nên chậm, nhưng không làm cho một cụm mật khẩu dễ đoán trở nên an toàn.
  • Trong khi keystore đang mở khóa, bất kỳ chương trình nào chạy dưới quyền của bạn đều có thể đọc khóa master từ keyring của kernel (một chương trình có phiên không giữ keyring của bạn vẫn có thể liên kết nó vào phiên của mình) và mở mọi mục, kể cả mục của một khóa. Các quy tắc riêng của erpc (chỉ đọc khóa mà [wallet] chỉ định khi có người ở terminal, không bao giờ đọc cho công cụ AI; không bao giờ mở một khóa lưu trong keystore như một secret) là những gì erpc làm; chúng không ràng buộc các chương trình khác chạy dưới quyền của bạn. Hãy chạy erpc worker secret lock khi bạn xong việc.
  • Tên của các mục không bị ẩn, và kích thước của một mục cho thấy giá trị dài bao nhiêu.
  • Một tệp bị thay đổi sẽ không mở được; một bản sao cũ hơn của cùng mục đó được đặt lại vào chỗ của nó thì vẫn mở được.
  • erpc worker secret rm xóa mục keystore của một secret cùng với dòng của nó trong erpc.toml (trừ khi một thiết lập khác của ứng dụng chỉ đến cùng mục đó), và để nguyên giá trị trong 1Password hoặc chuỗi khóa. Lệnh này không xóa sạch dữ liệu trên ổ đĩa, và các bản sao trong bản sao lưu của bạn vẫn còn.
  • erpc không bao giờ xóa hay ghi đè mục của khóa trading. Để thay một khóa, hãy chuyển tiền đi trước, rồi tự xóa tệp của khóa và [wallet].
  • Một thiết lập không thể có tên WALLET, dù viết hoa, viết thường hay kết hợp cả hai, trong keystore hoặc chuỗi khóa; --store 1password chấp nhận tên này.

Làm việc với khóa trading

LệnhChức năng
erpc worker key newTạo khóa trading và in ra khóa công khai để nạp tiền
erpc worker key import <FILE>Chuyển một tệp khóa vào 1Password, chuỗi khóa hoặc keystore, rồi đề nghị xóa sạch tệp
erpc worker key showHiển thị khóa công khai của khóa và nơi lưu khóa
erpc worker key balanceHiển thị số dư của khóa, thông qua thiết lập RPC riêng của ứng dụng
erpc worker key send --to <ADDRESS> --sol <N>Ký một giao dịch chuyển tiền trong bộ nhớ sau khi bạn đồng ý ở terminal. --all gửi toàn bộ trừ phí
Khi erpc kết thúc mà không biết một giao dịch chuyển tiền đã lên chain hay chưa, hãy tra cứu chữ ký của giao dịch đó trước khi gửi lại: lần gửi thứ hai là một giao dịch chuyển tiền thứ hai.