Tạo một transaction trên Solana sử dụng Ethereum Key Pair
Sử dụng Solana Native Program Secp256k1 để cho phép Ethereum key pair sở hữu data trên Solana một cách an toàn và tiện lợi.
Không thể phủ nhận việc hệ sinh thái xung quanh Ethereum Virtual Machine (EVM) có một cộng đồng người sử dụng đông hơn Solana nên việc convert người dùng EVM sang Solana cũng là 1 chủ đề mà các Solana Builder có quan tâm. Điểm khó khăn ở đây là: EVM sử dụng thuật toán secp256k1 để tạo ra cặp public - private key còn Solana sử dụng thuật toán ed25519 dẫn tới private key của EVM user không sử dụng được ở Solana.
Tuy nhiên, trong số các Native Program của Solana có 1 chương trình tên là Secp256k1 cho phép ta nhận input là 1 tripple (secp256k1 public key, hashed, content_before_hash) và validate nó. Điều này cho phép chúng ta sử dụng secp256k1 public key làm owner của một pda account một cách hoàn toàn nhanh và bảo mật Nếu sử dụng tính năng này kết hợp với khả năng hỗ trợ multiple signer của Solana - cho phép thực thi gas-less transaction một cách hoàn toàn an toàn - thì chúng ta có thể thiết kế 1 chương trình trên Solana cho Ethereum user sử dụng mà họ không cần tạo thêm bất cứ địa chỉ ví nào khác!
Thiết kế của chương trình như sau:
B1. User ký bằng Metamask với 1 original data; tạo ra một tripple (secp256k1 public key, hashed, content_before_hash)
B2. Tại client, tạo ra 1 key solana random để sign lần 1 trên transaction nhằm đảo bảo dữ liệu được truyền đi an toàn.
Trong txn này có 1 instruction gọi tới 1 Program có sử dụng Secp256k1.
B3. Client gửi transaction đã được ký 1 phần này lên server. Tại đây server sẽ ký nốt bằng ví của mình, trả phí và submit lên Solana.
B4. Program tại Solana sẽ xử lý, validate xem tripple đưa lên có hợp lệ hay không. Nếu có, Program sẽ ghi lại dữ liệu và xác định secp256k1 public key là owner của dữ liệu mới ghi.
B5. Trong các giao dịch tương lai, chỉ có key secp256k1 tạo ra dữ liệu ở B1 mới có thể chỉnh sửa dữ liệu này.
Đây chính là ý tưởng mà bạn Châu Khắc đã implement trong bài viết này. Các bạn có thể tìm repo ở đây.
Mình xin phép được repost bài viết dưới đây:
Project description
The project comprises of two main components. The first component involves using MetaMask
wallet to sign and create the signature from your message. The second component involves writing a custom program and deploying it on the Solana
network. Bringing these two components together is the main objective of this project, showcasing how to create and transmit a transaction in Solana using an EVM keypair for signing, along with interacting with the Solana network through a custom program.
These are the references:
Table of Contents
Connect and Signing with Metamask:
Create a simple DApp to connect with your Metamask wallet.
Creaet input box for user to input the message.
Signing your message with
Metamask
by usingpersonal_sign
method. (Note: It is necessary to convert the message to hex and add the currency0x
)Verify this signature by using
ethers.utils.verifyMessage
to verify the signature.
Write Anchor Program in Solana:
Write a simple transaction to interact with the
Secp256k1 Program
on theSolana
network (Example).Write your own program to create PDA accounts and deploy it to the
Solana
network.Write your own client.ts to interact with the program you wrote.
Combination:
Create
client
andserver
, client to interact with metamask wallet, and server to interact with solana network.Get the signature, message, publickey of the eth address and wrap it up as the data of an instruction and send it to the server (Note: The message should be modified because when using the personal_sign method the message was modified to
\x19Ethereum Signed Message:\n${message.length}${message}
)Update your program has written above, create 2 functions, one is create PDA account has amount, another is transfer amount from one PDA account to another PDA account (Example).
The server will create a transaction with 2 instructions, one to send to the Secp256k1 Program to verify the signature of the metamask wallet and one to interact with your Program.
Discoveries:
If it only takes one person to sign, use
sign
.To accommodate multiple signers, use
transaction.partialSign(signer)
to sign the transaction. Usingtransaction.sign(signer)
would nullify the signatures of previous signers, preventing confirmation of transactions with multiple signers.If you serialize the same transaction multiple times, the network state will be out of sync, so set
skipPreflight:true
when usesendEncodedTransaction
instead ofsendTransaction
to avoid issues.
Install and run
In user role
yarn start
In server role
cd server
node server.js
Chú ý: khi sử dụng secp256k1 public key làm seed của PDA cần tách public key làm 2 phần vì độ dài của secp256k1 lớn hơn độ dài cho phép của một seed.
Kết luận
Không có nhiều dự án trong Solana sử dụng tính năng này, cá nhân mình chỉ biết Audius. Tuy vậy, mình tin là việc sử dụng tính năng này sẽ tăng độ phổ biến của Solana và đóng góp tích cực cho hệ sinh thái.
P/S: Nếu các bạn cần hỗ trợ về công nghệ này, hãy liên hệ tác giả nhé.