Kiểm tra ứng dụng khách TON (Mạng mở Telegram) và ngôn ngữ Fift mới cho hợp đồng thông minh

Hơn một năm trước, người ta đã biết về kế hoạch phát hành mạng lưới phi tập trung của riêng mình. Telegram mở mạng. Sau đó, một tài liệu kỹ thuật đồ sộ đã xuất hiện, được cho là do Nikolai Durov viết và mô tả cấu trúc của mạng trong tương lai. Đối với những người đã bỏ lỡ nó, tôi khuyên bạn nên đọc phần kể lại của tôi về tài liệu này (Phần 1, Phần 2; phần thứ ba, than ôi, vẫn đang bám bụi trong bản nháp).

Kể từ đó, không có tin tức quan trọng nào về tình trạng phát triển TON cho đến vài ngày trước (tại một trong những kênh không chính thức) liên kết đến trang không xuất hiện https://test.ton.org/download.htmlnằm ở đâu:
tấn-test-liteclient-full.tar.xz — nguồn máy khách nhẹ cho mạng thử nghiệm TON;
tấn-lite-client-test1.config.json - tệp cấu hình để kết nối với mạng thử nghiệm;
README - thông tin về việc lắp ráp và ra mắt khách hàng;
LÀM THẾ NÀO ĐỂ — hướng dẫn từng bước về cách tạo hợp đồng thông minh bằng ứng dụng khách;
tấn.pdf — tài liệu cập nhật (ngày 2 tháng 2019 năm XNUMX) với tổng quan kỹ thuật về mạng TON;
tvm.pdf — mô tả kỹ thuật của TVM (TON Virtual Machine, máy ảo TON);
tblkch.pdf — mô tả kỹ thuật về chuỗi khối TON;
cơ sở thứ năm.pdf — mô tả về ngôn ngữ Fift mới, được thiết kế để tạo hợp đồng thông minh bằng TON.

Tôi nhắc lại, không có xác nhận chính thức nào về trang này và tất cả các tài liệu này từ Telegram, nhưng khối lượng của những tài liệu này khiến chúng khá hợp lý. Khởi chạy ứng dụng khách đã xuất bản tự chịu rủi ro.

Xây dựng khách hàng thử nghiệm

Trước tiên, hãy thử xây dựng và chạy một ứng dụng khách thử nghiệm - may mắn thay, README mô tả chi tiết quá trình đơn giản này. Tôi sẽ thực hiện việc này bằng macOS 10.14.5 làm ví dụ; tôi không thể đảm bảo sự thành công của quá trình xây dựng trên các hệ thống khác.

  1. Tải về và giải nén kho lưu trữ nguồn. Điều quan trọng là phải tải xuống phiên bản mới nhất vì khả năng tương thích ngược không được đảm bảo ở giai đoạn này.

  2. Đảm bảo rằng các phiên bản mới nhất của make, cmake (phiên bản 3.0.2 trở lên), OpenSSL (bao gồm tệp tiêu đề C), g++ hoặc clang được cài đặt trên hệ thống. Tôi không phải cài đặt bất cứ thứ gì, mọi thứ đều ổn ngay lập tức.

  3. Giả sử các nguồn được giải nén vào một thư mục ~/lite-client. Tách biệt khỏi nó, tạo một thư mục trống cho dự án đã tập hợp (ví dụ: ~/liteclient-build) và từ đó (cd ~/liteclient-build) gọi các lệnh:

    cmake ~/lite-client
    cmake --build . --target test-lite-client

    Kiểm tra ứng dụng khách TON (Mạng mở Telegram) và ngôn ngữ Fift mới cho hợp đồng thông minh

    Để xây dựng trình thông dịch ngôn ngữ Fift cho hợp đồng thông minh (xem thêm thông tin bên dưới), chúng tôi cũng gọi

    cmake --build . --target fift

  4. Tải xuống cái hiện tại tập tin cấu hình để kết nối với mạng thử nghiệm và đặt nó vào thư mục cùng với máy khách đã được tập hợp.

  5. Kết thúc, bạn có thể khởi động máy khách:

    ./test-lite-client -C ton-lite-client-test1.config.json

Nếu mọi thứ được thực hiện chính xác, bạn sẽ thấy một cái gì đó như thế này:

Kiểm tra ứng dụng khách TON (Mạng mở Telegram) và ngôn ngữ Fift mới cho hợp đồng thông minh

Như chúng ta có thể thấy, có một vài lệnh có sẵn:
help — hiển thị danh sách lệnh này;
quit - đi ra ngoài;
time - hiển thị thời gian hiện tại trên máy chủ;
status - hiển thị kết nối và trạng thái cơ sở dữ liệu cục bộ;
last — cập nhật trạng thái của blockchain (tải xuống khối cuối cùng). Điều quan trọng là phải chạy lệnh này trước bất kỳ yêu cầu nào để đảm bảo rằng bạn nhìn thấy trạng thái hiện tại của mạng.
sendfile <filename> — tải tệp cục bộ lên mạng TON. Đây là cách xảy ra tương tác với mạng - ví dụ: bao gồm việc tạo hợp đồng thông minh mới và yêu cầu chuyển tiền giữa các tài khoản;
getaccount <address> - hiển thị hiện tại (tại thời điểm lệnh được thực thi) last) trạng thái của tài khoản có địa chỉ được chỉ định;
privkey <filename> - tải khóa riêng từ một tệp cục bộ.

Nếu khi khởi động máy khách, bạn chuyển một thư mục sang nó bằng tùy chọn -D, sau đó anh ta sẽ thêm khối cuối cùng của masterchain vào đó:

./test-lite-client -C ton-lite-client-test1.config.json -D ~/ton-db-dir

Bây giờ chúng ta có thể chuyển sang những điều thú vị hơn - học ngôn ngữ Fift, thử biên soạn hợp đồng thông minh (ví dụ: tạo ví thử nghiệm), tải nó lên mạng và thử chuyển tiền giữa các tài khoản.

Ngôn ngữ thứ năm

Từ tài liệu cơ sở thứ năm.pdf bạn có thể biết rằng nhóm Telegram đã tạo một ngôn ngữ ngăn xếp mới để tạo hợp đồng thông minh năm (rõ ràng từ số thứ năm, tương tự như Forth, một ngôn ngữ mà Fifth có nhiều điểm chung).

Tài liệu khá đồ sộ, 87 trang, và tôi sẽ không kể lại chi tiết nội dung của nó trong khuôn khổ bài viết này (ít nhất là vì tôi cũng chưa đọc xong :). Tôi sẽ tập trung vào những điểm chính và đưa ra một vài ví dụ về mã bằng ngôn ngữ này.

Ở mức độ cơ bản, cú pháp của Fift khá đơn giản: mã của nó bao gồm từ, thường được phân tách bằng dấu cách hoặc dấu ngắt dòng (trường hợp đặc biệt: một số từ không yêu cầu dấu phân cách sau chính chúng). Bất kì từ là một chuỗi ký tự phân biệt chữ hoa chữ thường tương ứng với một số nhất định xác định (đại khái là người phiên dịch nên làm gì khi gặp từ này). Nếu không có định nghĩa của một từ, trình thông dịch sẽ cố gắng phân tích nó dưới dạng số và đặt nó vào ngăn xếp. Nhân tiện, các số ở đây - đột nhiên - là số nguyên 257 bit và không có phân số nào cả - chính xác hơn, chúng ngay lập tức biến thành một cặp số nguyên, tạo thành tử số và mẫu số của một phân số hữu tỷ.

Các từ có xu hướng tương tác với các giá trị ở đầu ngăn xếp. Một loại từ riêng biệt - tiếp đầu ngữ — không sử dụng ngăn xếp mà sử dụng các ký tự tiếp theo từ tệp nguồn. Ví dụ: đây là cách triển khai chuỗi ký tự - ký tự trích dẫn (") là từ tiền tố tìm kiếm trích dẫn (kết thúc) tiếp theo và đẩy chuỗi giữa chúng vào ngăn xếp. Một lớp lót hoạt động theo cách tương tự (//) và đa dòng (/*) bình luận.

Đây là nơi gần như toàn bộ cấu trúc bên trong của ngôn ngữ kết thúc. Mọi thứ khác (bao gồm cả cấu trúc điều khiển) được định nghĩa là các từ (có thể là nội bộ, chẳng hạn như các phép tính số học và định nghĩa của các từ mới; hoặc được định nghĩa trong "thư viện chuẩn" Fift.fif, nằm trong thư mục crypto/fift trong các nguồn).

Một chương trình ví dụ đơn giản trong Fift:

{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .

Dòng đầu tiên định nghĩa một từ mới setxy (lưu ý tiền tố {, tạo một khối trước khối đóng } và tiền tố :, mà thực sự xác định từ này). setxy lấy một số từ đầu ngăn xếp, định nghĩa (hoặc định nghĩa lại) nó là toàn cục không thay đổi xvà bình phương của số này là một hằng số y (Vì giá trị của các hằng số có thể được xác định lại nên tôi thích gọi chúng là biến hơn, nhưng tôi tuân theo quy ước đặt tên trong ngôn ngữ).

Hai dòng tiếp theo đặt một số vào ngăn xếp và gọi setxy, khi đó các giá trị của hằng số được hiển thị x, y (từ này được sử dụng cho đầu ra .), cả hai hằng số được đặt vào ngăn xếp, tính tổng và kết quả cũng được in ra. Kết quả là chúng ta sẽ thấy:

3 9 12 ok
7 49 56 ok

(Dòng “ok” được trình thông dịch in ra khi xử lý xong dòng hiện tại ở chế độ nhập tương tác)

Vâng, một ví dụ mã đầy đủ:

"Asm.fif" include

-1 constant wc  // create a wallet in workchain -1 (masterchain)

// Create new simple wallet
<{  SETCP0 DUP IFNOTRET INC 32 THROWIF  // return if recv_internal, fail unless recv_external
    512 INT LDSLICEX DUP 32 PLDU   // sign cs cnt
    c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS  // sign cs cnt cnt' pubk
    s1 s2 XCPU            // sign cs cnt pubk cnt' cnt
    EQUAL 33 THROWIFNOT   // ( seqno mismatch? )
    s2 PUSH HASHSU        // sign cs cnt pubk hash
    s0 s4 s4 XC2PU        // pubk cs cnt hash sign pubk
    CHKSIGNU              // pubk cs cnt ?
    34 THROWIFNOT         // signature mismatch
    ACCEPT
    SWAP 32 LDU NIP 
    DUP SREFS IF:<{
      8 LDU LDREF         // pubk cnt mode msg cs
      s0 s2 XCHG SENDRAWMSG  // pubk cnt cs ; ( message sent )
    }>
    ENDS
    INC NEWC 32 STU 256 STU ENDC c4 POPCTR
}>c
// code
<b 0 32 u, 
   newkeypair swap dup constant wallet_pk 
   "new-wallet.pk" B>file
   B, 
b> // data
// no libraries
<b b{00110} s, rot ref, swap ref, b>  // create StateInit
dup ."StateInit: " <s csr. cr
dup hash dup constant wallet_addr
."new wallet address = " wc . .": " dup x. cr
wc over 7 smca>$ type cr
256 u>B "new-wallet.addr" B>file
<b 0 32 u, b>
dup ."signing message: " <s csr. cr
dup hash wallet_pk ed25519_sign_uint rot
<b b{1000100} s, wc 8 i, wallet_addr 256 u, b{000010} s, swap <s s, b{0} s, swap B, swap <s s, b>
dup ."External message for initialization is " <s csr. cr
2 boc+>B dup Bx. cr
"new-wallet-query.boc" tuck B>file
."(Saved to file " type .")" cr

Tệp trông đáng sợ này dùng để tạo hợp đồng thông minh - nó sẽ được đặt trong một tệp new-wallet-query.boc sau khi thực hiện. Xin lưu ý rằng ở đây, một ngôn ngữ lắp ráp khác được sử dụng cho Máy ảo TON (tôi sẽ không nói chi tiết về nó), các hướng dẫn về ngôn ngữ này sẽ được đặt trên blockchain.

Do đó, trình biên dịch mã cho TVM được viết bằng Fift - nguồn của trình biên dịch mã này nằm trong tệp crypto/fift/Asm.fif và được kết nối ở đầu đoạn mã trên.

Tôi có thể nói gì đây, rõ ràng Nikolai Durov chỉ thích tạo ra các ngôn ngữ lập trình mới :)

Tạo hợp đồng thông minh và tương tác với TON

Vì vậy, giả sử chúng ta đã tập hợp ứng dụng khách TON và trình thông dịch Fift như mô tả ở trên và làm quen với ngôn ngữ này. Làm thế nào để tạo một hợp đồng thông minh bây giờ? Điều này được mô tả trong tập tin LÀM THẾ NÀO ĐỂ, gắn liền với các nguồn.

Tài khoản bằng TON

Như tôi đã mô tả ở TẤN xem xét, mạng này chứa nhiều hơn một chuỗi khối - có một chuỗi khối chung, được gọi là. "chuỗi chính", cũng như số lượng "chuỗi công việc bổ sung" tùy ý, được xác định bằng số 32 bit. Masterchain có mã định danh là -1, ngoài ra, có thể sử dụng chuỗi công việc “cơ sở” có mã định danh là 0. Mỗi chuỗi công việc có thể có cấu hình riêng. Trong nội bộ, mỗi chuỗi công việc được chia thành các chuỗi phân đoạn, nhưng đây là chi tiết triển khai không cần phải lưu ý.

Trong một chuỗi làm việc, nhiều tài khoản được lưu trữ có mã định danh account_id riêng. Đối với chuỗi chính và chuỗi công việc số 256, chúng dài XNUMX bit. Do đó, mã định danh tài khoản được viết, ví dụ như sau:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Đây là định dạng "thô": đầu tiên là ID chuỗi công việc, sau đó là dấu hai chấm và ID tài khoản ở dạng thập lục phân.

Ngoài ra, còn có một định dạng rút gọn - số chuỗi công việc và địa chỉ tài khoản được mã hóa ở dạng nhị phân, tổng kiểm tra được thêm vào chúng và tất cả điều này được mã hóa trong Base64:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Biết định dạng bản ghi này, chúng tôi có thể yêu cầu trạng thái hiện tại của tài khoản thông qua ứng dụng khách thử nghiệm bằng lệnh

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Chúng ta sẽ nhận được một cái gì đó như thế này:

[ 3][t 2][1558746708.815218925][test-lite-client.cpp:631][!testnode]    requesting account state for -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D
[ 3][t 2][1558746708.858564138][test-lite-client.cpp:652][!testnode]    got account state for -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D with respect to blocks (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F and (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F
account state is (account
  addr:(addr_std
    anycast:nothing workchain_id:-1 address:x8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D)
  storage_stat:(storage_info
    used:(storage_used
      cells:(var_uint len:1 value:3)
      bits:(var_uint len:2 value:539)
      public_cells:(var_uint len:0 value:0)) last_paid:0
    due_payment:nothing)
  storage:(account_storage last_trans_lt:74208000003
    balance:(currencies
      grams:(nanograms
        amount:(var_uint len:7 value:999928362430000))
      other:(extra_currencies
        dict:hme_empty))
    state:(account_active
      (
        split_depth:nothing
        special:nothing
        code:(just
          value:(raw@^Cell 
            x{}
             x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
            ))
        data:(just
          value:(raw@^Cell 
            x{}
             x{0000000D}
            ))
        library:hme_empty))))
x{CFF8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D2068086C000000000000000451C90E00DC0E35B7DB5FB8C134_}
 x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
 x{0000000D}

Chúng tôi thấy cấu trúc được lưu trữ trong DHT của chuỗi công việc được chỉ định. Ví dụ, trong lĩnh vực storage.balance là số dư tài khoản vãng lai, tính bằng storage.state.code - mã hợp đồng thông minh, và trong storage.state.data - dữ liệu hiện tại của nó. Xin lưu ý rằng bộ lưu trữ dữ liệu TON - Ô, ô - có dạng cây, mỗi ô có thể có cả dữ liệu riêng và ô con. Điều này được thể hiện dưới dạng thụt lề ở dòng cuối cùng.

Xây dựng hợp đồng thông minh

Bây giờ chúng ta hãy tự tạo một cấu trúc như vậy (nó được gọi là BOC - túi tế bào) bằng ngôn ngữ Fift. May mắn thay, bạn không phải tự viết hợp đồng thông minh - trong thư mục crypto/block có một tập tin từ kho lưu trữ nguồn new-wallet.fif, điều này sẽ giúp chúng tôi tạo một ví mới. Hãy sao chép nó vào thư mục với ứng dụng khách đã được lắp ráp (~/liteclient-build, nếu bạn làm theo hướng dẫn ở trên). Tôi đã trích dẫn nội dung của nó ở trên làm ví dụ về mã trên Fift.

Thực hiện tập tin này như sau:

./crypto/fift -I"<source-directory>/crypto/fift" new-wallet.fif

Здесь <source-directory> phải được thay thế bằng đường dẫn đến các nguồn đã giải nén (rất tiếc, không thể sử dụng biểu tượng “~” ở đây, cần có đường dẫn đầy đủ). Thay vì sử dụng chìa khóa -I bạn có thể định nghĩa một biến môi trường FIFTPATH và đặt đường dẫn này vào nó.

Kể từ khi chúng tôi khởi chạy Fift với tên tệp new-wallet.fif, nó sẽ thực thi và thoát. Nếu bạn bỏ qua tên tệp, bạn có thể sử dụng trình thông dịch một cách tương tác.

Sau khi thực thi, một cái gì đó như thế này sẽ được hiển thị trong bảng điều khiển:

StateInit: x{34_}
 x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
 x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}

new wallet address = -1 : 4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 
0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ
signing message: x{00000000}

External message for initialization is x{89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001_}
 x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
 x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}

B5EE9C724104030100000000D60002CF89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001001020084FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED5400480000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B6290698B
(Saved to file new-wallet-query.boc)

Điều này có nghĩa là ví có ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (hoặc, cái gì giống nhau, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) thành công trong việc tạo ra. Mã tương ứng sẽ có trong tập tin new-wallet-query.boc, địa chỉ của anh ấy ở new-wallet.addr, và khóa riêng nằm trong new-wallet.pk (hãy cẩn thận - chạy lại tập lệnh sẽ ghi đè lên các tệp này).

Tất nhiên, mạng TON vẫn chưa biết về ví này; nó chỉ được lưu trữ dưới dạng các tệp này. Bây giờ nó cần phải được tải lên mạng. Tuy nhiên, vấn đề là để tạo hợp đồng thông minh, bạn cần phải trả phí hoa hồng và số dư tài khoản của bạn vẫn bằng XNUMX.

Ở chế độ làm việc, vấn đề này sẽ được giải quyết bằng cách mua gram trên sàn giao dịch (hoặc chuyển từ ví khác). Chà, trong chế độ thử nghiệm hiện tại, một hợp đồng thông minh đặc biệt đã được tạo, từ đó bạn có thể yêu cầu tối đa 20 gram như thế.

Tạo yêu cầu cho hợp đồng thông minh của người khác

Chúng tôi đưa ra yêu cầu đối với một hợp đồng thông minh phân phối gram trái và phải như thế này. Trong cùng một thư mục crypto/block tìm tập tin testgiver.fif:

// "testgiver.addr" file>B 256 B>u@ 
0x8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
dup constant wallet_addr ."Test giver address = " x. cr

0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2
constant dest_addr

-1 constant wc
0x00000011 constant seqno

1000000000 constant Gram
{ Gram swap */ } : Gram*/

6.666 Gram*/ constant amount

// b x --> b'  ( serializes a Gram amount )
{ -1 { 1+ 2dup 8 * ufits } until
  rot over 4 u, -rot 8 * u, } : Gram, 

// create a message (NB: 01b00.., b = bounce)
<b b{010000100} s, wc 8 i, dest_addr 256 u, amount Gram, 0 9 64 32 + + 1+ 1+ u, "GIFT" $, b>
<b seqno 32 u, 1 8 u, swap ref, b>
dup ."enveloping message: " <s csr. cr
<b b{1000100} s, wc 8 i, wallet_addr 256 u, 0 Gram, b{00} s,
   swap <s s, b>
dup ."resulting external message: " <s csr. cr
2 boc+>B dup Bx. cr
"wallet-query.boc" B>file

Chúng tôi cũng sẽ lưu nó trong thư mục với ứng dụng khách đã được lắp ráp, nhưng chúng tôi sẽ sửa dòng thứ năm - trước dòng “constant dest_addr". Hãy thay thế bằng địa chỉ ví mà bạn đã tạo trước đó (đầy đủ, không viết tắt). Không cần viết “-1:” ở đầu mà hãy ghi “0x” ở đầu.

Bạn cũng có thể thay đổi dòng 6.666 Gram*/ constant amount — đây là số lượng tính bằng gam mà bạn yêu cầu (không quá 20). Ngay cả khi bạn chỉ định một số nguyên, hãy để lại dấu thập phân.

Cuối cùng, bạn cần sửa lại dòng 0x00000011 constant seqno. Số đầu tiên ở đây là số thứ tự hiện tại, được lưu trong tài khoản phát hành gram. Tôi có thể lấy nó từ đâu? Như đã nêu ở trên, khởi động máy khách và chạy:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Cuối cùng, dữ liệu hợp đồng thông minh sẽ chứa

...
x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
 x{0000000D}

Số 0000000D (số của bạn sẽ lớn hơn) là số thứ tự phải được thay thế thành testgiver.fif.

Thế là xong, lưu file và chạy (./crypto/fift testgiver.fif). Đầu ra sẽ là một tập tin wallet-query.boc. Đây là những gì được hình thành tin nhắn đến hợp đồng thông minh của người khác - một yêu cầu "chuyển rất nhiều gram vào tài khoản đó và tài khoản đó."

Sử dụng ứng dụng khách, chúng tôi tải nó lên mạng:

> sendfile wallet-query.boc
[ 1][t 1][1558747399.456575155][test-lite-client.cpp:577][!testnode]    sending query from file wallet-query.boc
[ 3][t 2][1558747399.500236034][test-lite-client.cpp:587][!query]   external message status is 1

Nếu bây giờ bạn gọi last, sau đó yêu cầu lại trạng thái của tài khoản mà chúng tôi đã yêu cầu gram, khi đó chúng tôi sẽ thấy rằng số thứ tự của nó đã tăng thêm một - điều này có nghĩa là nó đã gửi tiền vào tài khoản của chúng tôi.

Bước cuối cùng vẫn còn - tải xuống mã ví của chúng tôi (số dư của nó đã được bổ sung, nhưng nếu không có mã hợp đồng thông minh, chúng tôi sẽ không thể quản lý nó). Chúng tôi thực hiện sendfile new-wallet-query.boc - và thế là xong, bạn đã có ví của riêng mình trong mạng TON (ngay cả khi hiện tại nó chỉ là ví thử nghiệm).

Tạo giao dịch gửi đi

Để chuyển tiền từ số dư tài khoản đã tạo có file crypto/block/wallet.fif, cũng cần được đặt trong thư mục với ứng dụng khách đã được lắp ráp.

Tương tự như các bước trước, bạn cần điều chỉnh số tiền muốn chuyển, địa chỉ người nhận (dest_addr) và seqno của ví (bằng 1 sau khi khởi tạo ví và tăng thêm 1 sau mỗi giao dịch gửi đi - bạn có thể xem nó bằng cách yêu cầu trạng thái tài khoản của bạn). Ví dụ: để kiểm tra, bạn có thể sử dụng ví của tôi - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Khi khởi động (./crypto/fift wallet.fif) tập lệnh sẽ lấy địa chỉ ví của bạn (từ nơi bạn chuyển) và khóa riêng của nó từ các tệp new-wallet.addr и new-wallet.pk, và tin nhắn nhận được sẽ được ghi vào new-wallet-query.boc.

Như trước đây, để trực tiếp thực hiện giao dịch, hãy gọi sendfile new-wallet-query.boc trong khách hàng. Sau này, đừng quên cập nhật trạng thái của blockchain (last) và kiểm tra xem số dư và số thứ tự của ví của chúng tôi đã thay đổi chưa (getaccount <account_id>).

Kiểm tra ứng dụng khách TON (Mạng mở Telegram) và ngôn ngữ Fift mới cho hợp đồng thông minh

Vậy là xong, bây giờ chúng ta có thể tạo hợp đồng thông minh bằng TON và gửi yêu cầu cho họ. Như bạn có thể thấy, chức năng hiện tại đã đủ để tạo ra một chiếc ví thân thiện hơn với giao diện đồ họa (tuy nhiên, dự kiến ​​​​nó sẽ có sẵn như một phần của trình nhắn tin).

Chỉ những người dùng đã đăng ký mới có thể tham gia khảo sát. Đăng nhập, xin vui lòng.

Bạn có muốn tiếp tục các bài viết phân tích TON, TVM, Fift không?

  • Vâng, tôi đang chờ hoàn thành chuỗi bài viết tổng quan về TON

  • Vâng, thật thú vị khi đọc thêm về ngôn ngữ Fift

  • Có, tôi muốn tìm hiểu thêm về Máy ảo TON và trình biên dịch mã cho nó

  • Không, điều này không thú vị chút nào

39 người dùng bình chọn. 12 người dùng bỏ phiếu trắng.

Bạn nghĩ gì về kế hoạch ra mắt TON của Telegram?

  • Tôi đặt nhiều hy vọng vào dự án này

  • Tôi chỉ đang theo dõi sự phát triển của nó với sự quan tâm.

  • Tôi hoài nghi và nghi ngờ sự thành công của nó.

  • Tôi có khuynh hướng coi sáng kiến ​​này là một thất bại và không cần thiết đối với đại chúng.

47 người dùng bình chọn. 12 người dùng bỏ phiếu trắng.

Nguồn: www.habr.com

Thêm một lời nhận xét