- Soạn thảo giao dịch tạo token
- Ký giao dịch giao dịch tạo token
- Submit giao dịch tạo token
- Kiểm tra token trên ví
Trong phần này, chúng ta sẽ tạo tài sản gốc --chứ không phải NFT
Chúng ta đặc biệt khuyên bạn nên tham khảo phần này để hiểu cách hoạt động của giao dịch và đúc tiền. Minting NFTs sẽ tuân theo quy trình tương tự, chỉ với một vài chỉnh sửa. Nếu bạn quan tâm NFT, vui lòng truy cập Minting NFTs.
- Một nút Cardano đang chạy và được đồng bộ hóa - có thể truy cập thông qua lệnh
cardano-cli. Hướng dẫn này được viết bằngcardano-cliv 1.27.0. Một số lệnh có thể thay đổi. - Bạn có một số kiến thức về Linux về cách điều hướng giữa các thư mục, tạo và chỉnh sửa tệp cũng như thiết lập và kiểm tra các biến thông qua Linux shell.
Hướng dẫn này sẽ cung cấp cho bạn một bản sao và hướng dẫn có thể dán qua vòng đời hoàn chỉnh của mã thông báo:
Đây sẽ là những bước chúng ta cần thực hiện để hoàn thành toàn bộ vòng đời:
- Thiết lập mọi thứ sẵn sàng
- Tạo địa chỉ và khóa (keys) mới
- Tạo chính sách đúc tiền
- Soạn thảo một giao dịch đúc tiền
- Tính phí
- Gửi mã thông báo giao dịch và đúc token (cho chính mình)
- Gửi token
- Đốt token
Chúng ta sẽ làm việc trong một thư mục mới, Đây là tổng quan về các file sẽ được tạo ra:
├── burn-native-assets.raw # Giao dich để đốt token
├── burn-native-assets.signed # File ký giao dịch đã được ký để đốt token
├── mint-native-assets.raw # Giao dịch tạo token
├── mint-native-assets.signed # File ký giao dịch tạo token
├── metadata.json # Metadata mô tả đặc tính NFT
├── test.payment-0.addr # Địa chỉ để gửi và nhận
├── test.payment-0.skey # Khóa ký giao dịch
├── test.payment-0.vkey # Khóa xác nhận giao dịch
├── policy # Thư mục chứa chính sách
│ ├── policy.script # Script tạo policyID
│ ├── policy.skey # Khóa ký Policy
│ ├── policy.vkey # Khóa xác nhận Policy
│ └── policyID # File chứa policy ID
└── protocol.json # File thông số hệ thống
Trước khi khai thác nội dung gốc, bạn cần tự hỏi bản thân ít nhất bốn câu hỏi sau:
- Tên của (các) mã thông báo sẽ là gì?
- Tôi muốn đúc bao nhiêu?
- Sẽ có giới hạn thời gian cho việc tương tác (đúc mã thông báo?)
- Ai sẽ có thể đúc chúng?
Số 1, 3 và 4 sẽ được xác định trong kịch bản chính sách tiền tệ (policy), trong khi số tiền thực tế sẽ chỉ được xác định trên giao dịch đúc tiền.
Đối với hướng dẫn này, chúng ta sẽ sử dụng:
- Tên của (các) mã thông báo tùy chỉnh của tôi sẽ là gì?
--> Chúng ta sẽ đặt tên là
TesttokenvàSecondTesttoken - Tôi muốn đúc bao nhiêu?
--> 10000000 each (10M
Testtokenand 10MSecondTesttoken) - Sẽ có giới hạn thời gian cho việc tương tác (đúc hoặc đốt mã thông báo?) ---> Không (tuy nhiên, chúng ta sẽ làm khi tạo NFT), chúng ta muốn đúc và đốt chúng theo cách chúng ta muốn.
- Ai sẽ có thể đúc chúng? --> chỉ có một chữ ký (mà chúng ta sơ hữu) mới có thể ký giao dịch và do đó có thể đúc mã thông báo
Vì chúng ta đã trả lời tất cả các câu hỏi ở trên, chúng ta sẽ đặt các biến trên terminal / bash của mình để làm cho khả năng đọc dễ dàng hơn một chút. Chúng ta cũng sẽ sử dụng testnet. Sự khác biệt duy nhất giữa việc khai thác nội dung gốc trong mạng chính là bạn cần thay thế testnet bằng mainnet.
Kể từ phiên bản cardano-cli 1.31.0, tên mã thông báo phải được mã hóa base16 . Vì vậy, ở đây, chúng ta sử dụng công cụ xxd để mã hóa tên mã thông báo.
BASENAME=test
testnet="--testnet-magic 2"
tokenname1=$(echo -n "CBCA1" | xxd -ps | tr -d '\n')
tokenname2=$(echo -n "CBCA2" | xxd -ps | tr -d '\n')
tokenamount="10000000"
output="20000000"Chúng ta sẽ sử dụng kỹ thuật thiết lập các biến này để giúp bạn dễ dàng theo dõi hơn..
Chính sách (Policies) là yếu tố quyết định công việc tài sản gốc. Chỉ những người sở hữu từ khóa chính sách mới mới có thể tạo ra tài liệu gốc theo chính sách này. Chúng ta sẽ tạo một thư mục con riêng biệt trong thư mục công việc của mình để giữ cho mọi thứ được tách biệt theo chính sách và có tổ chức hơn. Để đọc thêm, vui lòng xem tài liệu chính thức hoặc trang github về tập lệnh đa chữ ký.
all
Kiểu type với giá trị khóa all chỉ ra rằng để chi tiêu đầu ra giao dịch này, cần có chữ ký tương ứng của tất cả các mã băm khóa thanh toán được liệt kê..
{
"scripts": [
{
"keyHash": "e09d36c79dec9bd1b3d9e152247701cd0bb860b5ebfd1de8abb6735a",
"type": "sig"
},
{
"keyHash": "a687dcc24e00dd3caafbeb5e68f97ca8ef269cb6fe971345eb951756",
"type": "sig"
},
],
"type": "all"
}mkdir policy:::note Chúng ta không điều hướng vào thư mục này và mọi thứ được thực hiện từ thư mục làm việc của chúng ta. :::
cardano-cli address key-gen \
--verification-key-file policy/policy.vkey \
--signing-key-file policy/policy.skeyTạo một tệp policy.script là chính sách đúc token.
touch policy/policy.script && echo "" > policy/policy.scriptSử dụng lệnh echo để điền vào tệp:
echo "{" >> policy/policy.script
echo " \"keyHash\": \"$(cardano-cli address key-hash --payment-verification-key-file policy/policy.vkey)\"," >> policy/policy.script
echo " \"type\": \"sig\"" >> policy/policy.script
echo "}" >> policy/policy.scriptChung ta có thể xem chúng.
nano policy/policy.scriptBây giờ chúng ta có một tệp tập lệnh đơn giản xác định khóa xác minh chính sách làm nhân chứng để ký giao dịch đúc. Không có ràng buộc nào khác như khóa mã thông báo hoặc yêu cầu chữ ký cụ thể để gửi thành công giao dịch với chính sách đúc tiền này.
Để đúc Token gốc, chúng ta cần tạo Policy ID từ tệp tập lệnh mà chúng ta đã tạo.
cardano-cli transaction policyid --script-file ./policy/policy.script > policy/policyIDĐầu ra được lưu vào tệp policyID vì chúng ta cần tham khảo nó sau này.
Mỗi giao dịch trong Cardano yêu cầu thanh toán một khoản phí — tính đến thời điểm hiện tại — phần lớn sẽ được xác định bởi quy mô của những gì chúng ta muốn truyền tải. Càng nhiều byte được gửi, phí càng cao.
Đó là lý do tại sao thực hiện giao dịch trong Cardano là một quá trình ba chiều.
- Đầu tiên, chúng ta sẽ xây dựng một giao dịch, kết quả là một tệp. Đây sẽ là cơ sở để tính phí giao dịch.
- Chúng ta sử dụng tệp
rawnày và các tham số giao thức của mình để tính phí - Sau đó, chúng ta cần xây dựng lại giao dịch, bao gồm phí chính xác và số tiền đã điều chỉnh mà chúng ta có thể gửi. Vì chúng ta gửi nó cho chính mình nên đầu ra cần phải là số tiền chúng ta tài trợ trừ đi phí tính toán.
Một điều khác cần lưu ý là mô hình về cách các giao dịch và "số dư" được thiết kế trong Cardano. Mỗi giao dịch có một (hoặc nhiều) đầu vào (nguồn tiền của bạn, chẳng hạn như hóa đơn bạn muốn sử dụng trong ví của mình để thanh toán) và một hoặc nhiều đầu ra. Trong ví dụ đúc tiền của chúng ta, đầu vào và đầu ra sẽ giống nhau - địa chỉ của chính chúng ta .
Trước khi bắt đầu, một lần nữa chúng ta sẽ cần một số thiết lập để giúp việc xây dựng giao dịch dễ dàng hơn.
Trước tiên, hãy truy vấn địa chỉ thanh toán của bạn và lưu ý các giá trị khác nhau hiện có.
cardano-cli query utxo $testnet --address $address Đầu ra của bạn sẽ trông giống như thế này (ví dụ hư cấu):
TxHash TxIx Amount
--------------------------------------------------------------------------------------
b35a4ba9ef3ce21adcd6879d08553642224304704d206c74d3ffb3e6eed3ca28 0 1000000000 lovelaceVì chúng ta cần từng giá trị đó trong giao dịch của mình nên chúng ta sẽ lưu trữ chúng riêng lẻ trong một biến tương ứng.
Tạo các biến để mint Token
txhash="75b550532dfe0b103b73b9a1b9dcc446ce4aaff3df06f06476e4efc951809a23"
txix="1"
policyid=$(cat policy/policyID)Bây giờ chúng ta đã sẵn sàng tạo giao dịch đầu tiên để tính phí của chúng ta và lưu nó vào một tệp có tên mint-native-assets.raw . Chúng ta sẽ tham chiếu các biến trong giao dịch của mình để cải thiện khả năng đọc vì chúng ta đã lưu gần như tất cả các giá trị cần thiết trong các biến. Đây là giao dịch của chúng ta trông như thế nào:
cardano-cli transaction build \
$testnet \
--babbage-era \
--tx-in $txhash#$txix \
--tx-out $address+$output+"$tokenamount $policyid.$tokenname1 + $tokenamount $policyid.$tokenname2" \
--mint "$tokenamount $policyid.$tokenname1 + $tokenamount $policyid.$tokenname2" \
--mint-script-file policy/policy.script \
--change-address $address \
--out-file mint-native-assets.raw--tx-in $txhash#$txix \Hàm băm của địa chỉ mà chúng ta sử dụng làm đầu vào cho giao dịch cần có đủ tiền. Vì vậy, cú pháp là: hàm băm, theo sau là dấu thăng, theo sau là giá trị TxIx của hàm băm tương ứng.
--tx-out $address+$output+"$tokenamount $policyid.$tokenname1 + $tokenamount $policyid.$tokenname2" \Đây là phần đầu ra quan trọng. Đối với --tx-out , chúng ta cần chỉ định địa chỉ nào sẽ nhận giao dịch của này. Trong trường hợp của chúng ta, chúng ta gửi mã thông báo đến địa chỉ của chúng ta.
- Địa chỉ
- Dấu cộng +
- Đầu ra tính bằng Lovelace (ada)
- Dấu cộng +
- Dấu ngoặc kép
- Số lượng mã thông báo
- Một khoảng trống
- id chính sách
- Một dấu chấm
- Tên mã thông báo (tùy chọn nếu bạn muốn có nhiều/mã thông báo khác nhau: một ô trống, một dấu cộng, một ô trống và bắt đầu lại từ 6.)
- dấu ngoặc kép
--mint="$tokenamount $policyid.$tokenname1 + $tokenamount $policyid.$tokenname2" \Một lần nữa, cú pháp tương tự như được chỉ định như trong --tx-out nhưng không có địa chỉ và số lovelace (ADA).
--change-address $address \Đậy là phần còn lại ADA của UTxO gửi lại đỉa chỉ ký.
--out-file mint-native-assets.rawCuối cùng, Chúng ta lưu giao dịch của mình vào một tệp mà bạn có thể đặt tên theo ý muốn. Chỉ cần đảm bảo tham chiếu đúng tên tệp trong các lệnh sắp tới.
Các giao dịch cần phải được ký để chứng minh tính xác thực và quyền sở hữu của khóa chính sách.
cardano-cli transaction sign $testnet \
--signing-key-file $address_SKEY \
--signing-key-file policy/policy.skey \
--tx-body-file mint-native-assets.raw \
--out-file mint-native-assets.signedGiao dịch đã ký sẽ được lưu trong một tệp mới có tên mint-native-assets.signed
Bây giờ chúng ta sẽ gửi giao dịch, do đó đúc tài sản gốc của chúng ta:
cardano-cli transaction submit $testnet --tx-file mint-native-assets.signed Xin chúc mừng, chúng ta hiện đã đúc thành công mã thông báo của riêng mình. Sau vài giây, chúng ta có thể kiểm tra địa chỉ đầu ra
cardano-cli query utxo $testnet --address $address và sẽ thấy một cái gì đó như thế này
TxHash TxIx Amount
--------------------------------------------------------------------------------------
d82e82776b3588c1a2c75245a20a9703f971145d1ca9fba4ad11f50803a43190 0 999824071 lovelace + 10000000 45fb072eb2d45b8be940c13d1f235fa5a8263fc8ebe8c1af5194ea9c.5365636F6E6454657374746F6B656E + 10000000 45fb072eb2d45b8be940c13d1f235fa5a8263fc8ebe8c1af5194ea9c.54657374746F6B656EĐể gửi mã thông báo đến ví, chúng ta cần tạo một giao dịch khác - chỉ lần này là không có tham số đúc. Chúng ta sẽ thiết lập các biến của chúng ta cho phù hợp.
address=$(cat $BASENAME.payment-0.addr)
address_SKEY="$BASENAME.payment-0.skey"
BOB_ADDR="addr_test1qz8shh6wqssr83hurdmqx44js8v7tglg9lm3xh89auw007dd38kf3ymx9c2w225uc7yjmplr794wvc96n5lsy0wsm8fq9n5epq"
LOVELACE_VALUE=2000000
policyid=$(cat policy/policyID)Chúng ta truy cập vào các biến khác từ quá trình đúc. Vui lòng kiểm tra xem các biến đó đã được đặt chưa:
echo Tokenname 1: $tokenname1
echo Tokenname 2: $tokenname2
echo Address: $address
echo Policy ID: $policyidcardano-cli query utxo $testnet --address $addressXác định UTXO sử dụng để chi tiêu từ ví của Alice với cú pháp: UTXO_IN=# Trong đó và được lấy từ kết quả của câu lệnh truy vấn trên, cụ thể như sau:
UTXO_IN=71dce5be551f2c69d139eb8de50b9cd94fa94d6b47214307c6f32e574820755d#0
cardano-cli transaction build $testnet \
--tx-in $UTXO_IN \
--tx-out $BOB_ADDR+$LOVELACE_VALUE+"2 $policyid.$tokenname1" \
--change-address $address \
--out-file simple-tx.rawBạn sẽ thấy xuất hiện file simple-tx.raw trong cùng thư mục thực hiện câu lệnh.
cardano-cli transaction sign $testnet \
--signing-key-file $address_SKEY \
--tx-body-file simple-tx.raw \
--out-file simple-tx.signedBạn sẽ thấy xuất hiện file simple-tx.signed trong cùng thư mục thực hiện câu lệnh.
cardano-cli transaction submit $testnet \
--tx-file simple-tx.signedTransaction successfully submitted. → Thông báo giao dịch đã được thực hiện thành công
cardano-cli query utxo $testnet --address $addressTrong phần cuối của vòng đời mã thông báo, chúng ta sẽ đốt 5000 mã thông báo mới được tạo SecondTesttoken , do đó sẽ hủy chúng vĩnh viễn.
Bạn sẽ không ngạc nhiên khi điều này — một lần nữa — sẽ được thực hiện với một giao dịch. Nếu bạn đã làm theo hướng dẫn này cho đến thời điểm này, thì bạn đã quen với quy trình, vì vậy hãy bắt đầu lại.
Thiết lập mọi thứ và kiểm tra địa chỉ của chúng ta:
cardano-cli query utxo --address $address $testnettxhash="5c6a453342dcfb902111fd74f095cf0f6780932d7967785c752fb7a9bba219be"
txix="1"
policyid=$(cat policy/policyID)Việc đốt mã thông báo khá đơn giản. Bạn sẽ đưa ra một hành động đúc kết mới, nhưng lần này với đầu vào âm . Điều này về cơ bản sẽ trừ đi số lượng mã thông báo.
cardano-cli transaction build \
$testnet \
--babbage-era \
--tx-in $txhash#$txix \
--mint="-5000 $policyid.$tokenname2" \
--minting-script-file policy/policy.script \
--change-address $address \
--out-file burn-native-assets.rawCác giao dịch cần phải được ký để chứng minh tính xác thực và quyền sở hữu của khóa chính sách.
cardano-cli transaction sign $testnet \
--signing-key-file $address_SKEY \
--signing-key-file policy/policy.skey \
--tx-body-file burn-native-assets.raw \
--out-file burn-native-assets.signedGiao dịch đã ký sẽ được lưu trong một tệp mới có tên burn-native-assets.signed
Bây giờ chúng ta sẽ gửi giao dịch, do đó đốt tài sản gốc của chúng ta:
cardano-cli transaction submit $testnet --tx-file burn-native-assets.signed Xin chúc mừng, chúng ta hiện đã đúc thành công mã thông báo của riêng mình. Sau vài giây, chúng ta có thể kiểm tra địa chỉ đầu ra
cardano-cli query utxo $testnet --address $address 