|Devblog#1| Thông tin tranh luận nội bộ về TronLink, bạn có biết ?

Những vấn đề tranh luận sôi nổi giữa các thành viên trong TronWatch khi phát triển tiện ích TronLink. Những ý kiến, sai lầm trong việc phát triển sẽ giải quyết như thế nào? Trước hết chúng ta sẽ điểm qua những quan điểm sai lầm đầu tiên:




Quan niệm chung

Tất cả mọi người chúng ta, đều có chung một quan niệm rằng: tiện ích của "Chrome", là một phần ứng dụng của họ đặt ra nhằm mục đích mang lại lợi ích cho họ. Nó chỉ đơn giản là một trang web dạng sandboxed với một số hàm API để giao tiếp với các trình duyệt và chẳng có gì là phức tạp.
Điều này đã hoàn toàn bị sai, khi tin rằng việc xây dựng một tiện ích mở rộng của chrome là đơn giản như một số chức năng nhỏ hay liên kết, gọi các chức năng từ các trang lại với nhau. Nhưng khi bắt tay vào nghiên cứu thì không như ta nghĩ, nó phức tạp hơn nhiều và ngoài ra nó rất hạn chế để phát triển các chức năng, không như đơn thuần xây dựng một trang web.

Những tranh luận đặt ra đối với TronLink

  1. Hướng đi và chức năng
    • Ý tưởng đầu tiên của TronWatch là tạo ra ứng dụng TronLink dựa trên nền tảng công nghệ blockchain. Vậy tại sao chúng ta không bắt tay vào thực hiện nó một cách tích cực, thay vì cứ ngồi đợi chờ. Vấn đề chúng ta cần xem xét tiếp theo là máy ảo TVM (Tron Virtual Machine): các ứng dụng web không thể giao tiếp với nó. Điều này chẳng có gì là tốt, khi tất cả các khoản đầu tư tài chính và vô số giờ nỗ lực trong công việc xây dựng một công nghệ mới mà người dùng thực sự không thể sử dụng được. Các ứng dụng gốc và các máy chủ phụ trợ có thể chắc chắn rằng sẽ giao tiếp được với nhau thông qua các nút chức năng, nhưng việc sử dụng nó là gì khi một trong các mục tiêu chính của TRON là phân cấp
    • Người dùng thì muốn kiểm soát các quỹ của riêng mình và cung cấp nhiên liệu "gas" cho blockchain của họ, mà không cần phụ thuộc và một công ty lớn nào hoặc bị tấn công?
  2. Cách quản lý và thực thi ứng dụng trong Tronlink?
    • TronLink phải thu hẹp khoảng cách giữa Tron Virtual Machine (Máy ảo TVM) và người dùng cuối của công nghệ blockchain. Mà không lấy đi những tiện ích trong trình duyệt riêng của họ. Giờ đây, người dùng có thể tinker với Dapps một cách nhanh chóng chỉ bằng một nút bấm.
    • Chỉ cần add(thêm) API TronLink toàn cầu vào tất cả các trang web tham gia, thì các nhà phát triển có thể truy cập dễ dàng vào blockchain. Mặc dù sẽ tốn một khoản phí, nhưng TronLink sẽ cho bạn cái quyền bỏ phiếu cho vị trí Super Representative hoặc sử dụng các chức năng của hợp đồng thông minh.

Hướng đi và cách giải quyết các vấn đề tranh luận mà người dùng đặt ra cho TRON

Sau tất cả, tiện ích mà chrome mang lại chỉ là các ứng dụng web: có quyền truy cập các thành phần nhất định giữa trình duyệt và người dùng. Nó rất khó khăn khi buộc các chức năng hoạt động đồng nhất với nhau.

Do tính chất Sandbox của ứng dụng, bạn không chỉ đơn thuần là chia sẻ mã giữa các cấu trúc thành phần hoặc sử dụng một chuỗi sự kiện để xử lý các hành động của người dùng trên trình duyệt. Hầu hết để triển khai tất cả các ứng dụng sandbox, thì đều rất hạn chế về mặt giao tiếp với máy chủ.

Chính vì vậy nên toàn bộ kiến trúc nền tảng của TronLink sẽ được xây dựng trên các hàm API của Web. Bằng cách mở rộng lưu lượng ứng dụng trên chrome, vì các trang web không thể tự động truy cập vào nội bộ của các ứng dụng, mà không cần thông qua kênh giao tiếp được. Đó là môi trường hoạt động của các mã Script và các mô-đun truyền các tín hiệu cho nhau.

Chúng ta hãy điểm qua bốn thành phần chính của một ứng dụng:

  1. BackgroudScripts
    • Là nơi thể hiện liên kết chính, trạng thái của các giao diện. Đây là nơi các mã được thực thi và các giao dịch được ký, các tài khoản được tạo ra, các sự kiện tác động lên API. Bất kỳ hoạt động liên quan đến các hoạt động, thao tác sẽ xảy ra ở đây.
  2. PageHook
    • Nó không xử lý nhiều như BackgroudScripts nhưng nó đóng một phần không nhỏ trong các ứng dụng. Nhiệm vụ chính là truyền và hiển thị các phiên bản của API Web, vào các Web sử dụng TronLink. Đây là những xử lý của các trang web kết nối với phần tiện ích mở rộng của chính nó.
  3. ContentScript
    • So với các mô-đun khác, người ta có thể tranh luận rằng contentScript chỉ là một phần chuyển động nhỏ trong một ứng dụng lớn. Thật vậy - nó có thể nhỏ nhưng nó không phải là nhỏ với bất kỳ định nghĩa nào. ContentScript thực sự đường dẫn ghép nối tất cả các giao tiếp giữa các pageHook với backgroundScript.
  4.  Popup
    • Popup là ứng dụng chính, và đó là cái mà chúng ta đề cập đến giao diện người dùng của phần mở rộng. Đây là nơi xác nhận xảy ra cùng với việc duyệt và kiểm soát chung tiện ích mở rộng. Nó có thể được kích hoạt bằng cách nhấn vào biểu tượng của TronLink trong thanh điều hướng trình duyệt hoặc bởi các trang web yêu cầu xác nhận.

Những thảo luận và thách thức của việc liên kết bốn mô-đun:

Như đã giải thích ngắn gọn ở trên, việc sử dụng một sandbox giới hạn việc giao tiếp giữa phần mở rộng và trang web. ContentScript chạy trong ngữ cảnh của trang web trong khi backgroundScript chạy từ bên trong sandbox của tiện ích. 
Điều này có nghĩa là tất cả thông tin liên lạc giữa hai kênh phải được chuyển giữa các kênh đã được đăng ký.
Đối với một nội dung để được thực hiện trên trang nền, thì cả hai nội dung đều phải thiết lập và liên kết với một kênh giao tiếp.

Các kênh này cung cấp cho hai kênh có khả năng tự do truyền các đối tượng JSON từ đầu này sang đầu kia. Điều quan trọng cần lưu ý là đây là các đối tượng JSON và không phải là các đối tượng JavaScript thông thường.


Điều này có nghĩa là chúng tôi không thể đảm bảo chắc chắn rằng: thông điệp chuyển đi có thể được giải quyết hoàn toàn hoặc bị từ chối và trả lại xác nhận hoặc phản hồi yêu cầu.


 Cấu trúc cơ bản về các kênh truyền thông
                  
Hình trên là một ví dụ về cách hình thành các kênh. Mỗi tab sẽ có một contentScript riêng của nó để thiết lập một giao tiếp với BackgroundScript. Sau đó, nó có thể gửi các thông điệp đến từng tab riêng lẻ, bằng cách tham chiếu đến các mã khóa (ID).

Khi một tab được tạo ra, nó sẽ được gán cho một ID duy nhất (một và chỉ một), thông thường là một số nguyên gồm 3 chữ số. Bộ xử lý kênh sẽ thông qua các cổng (port) mà mỗi kênh được gán. Bằng cách liên kết theo từng cổng và ID, thì chúng tôi có thể tham chiếu đến từng tab riêng lẻ mà không sợ bị trùng.
VD về BackgrourdScript:
chrome.extension.onconnect.addListener (port => { 
    const source = `$ {port.name} - $ {port.sender.tab.id}`; 
    this._channels [source] = port; 
});
Bây giờ bất cứ khi nào chúng ta nhận được một sự kiện từ contentScript, chúng ta chỉ có thể trả về một sự kiện bằng cách gửi một thông báo đến cổng được gán cho tham chiếu duy nhất của nó. Chúng ta có thể thực hiện điều này như sau:
chrome.extension.onconnect.addListener (port => { 
    const source = `$ {port.name} - $ {port.sender.tab.id}`; 
    this.channels [source] = port;
    port.onMessage.addListener (({action, data} = event) => { 
        this.emit (event.action, {data, source}); 
    }); 
});
Mỗi lần nhận được tin nhắn, chúng tôi phát ra một sự kiện mới với dữ liệu được cung cấp và nguồn của kênh truyền thông. Để trả lời một tin nhắn, chúng tôi sẽ thực hiện như sau:
communication.on ('someEvent', ({data, source}) => { 
    this.channels [source] .postMessage ({ 
        action: 'response', 
        data: {ts: Date.now ()} 
    }); 
}) ;
 Cấu trúc cao cấp về cách truyền các sự kiện trên các kênh truyền thông

Chắc chắn, chúng tôi chỉ có thể theo dõi và tham chiếu từng thông báo đến và nguồn sự kiện cho mọi sự kiện duy nhất nhưng điều thú vị là gì? Nó không chỉ làm nổi bật codebase mà nó còn làm cho việc áp dụng các ứng dụng trở nên khó khăn hơn, và gỡ lỗi thậm chí còn khó khăn hơn trong một nhiệm vụ.
Để khắc phục điều này, tôi đã thực hiện một lớp trừu tượng mà tôi gọi LinkedResponse -  tương tự contentScript có lớp riêng của nó được gọi LinkedRequestbackgroundScript sẽ chuyển tiếp tất cả các sự kiện xảy ra theo hành động tunnelnày LinkedResponse, sau đó sẽ ghép nối các câu trả lời cho các sự kiện ban đầu.

Tôi đã triển khai điều này bằng cách gửi một ID duy nhất cho mỗi thư -  LinkedResponsesẽ lấy ID duy nhất này, phát ra một sự kiện với lời hứa và khi lời hứa được giải quyết, (hoặc bị từ chối) phát ra một sự kiện mới cho contentScript sẽ chứa cùng một duy nhất ID.

Hãy nhớ rằng khi tôi đề cập đến contentScript trước đó? Nó cũng lắng nghe tất cả các tunnelsự kiện và sẽ lấy ID duy nhất này, ghép nối nó với yêu cầu ban đầu và giải quyết lời hứa mà nó đã tạo ra lần đầu tiên.
Cách sử dụng cơ bản như sau:
# contentScriptlinkedRequest.build ({
method: 'testMethod',
data: {ts: Date.now ()}
}). then (response => {
logger.info (`Received from backgroundScript: ${response}`);
}). catch (error => {
logger.info (`Error from backgroundScript: ${error}`);
});# backgroundScriptlinkedResponse.on ('request', ({reject, resolve, payload}) => {
switch (payload.method) {
case 'testMethod':
resolve (payload.data);
}
});
Trong phần trình bày ở trên, contentScript sẽ phát ra một sự kiện cho backgroundScript được gọi là testMethod có chứa dấu thời gian hiện tại làm dữ liệu của nó. BackgroundScript sẽ nhận được sự kiện, xử lý việc testMethod kích hoạt và trả về cùng một dấu thời gian đã được gửi đi ban đầu.

Đây là một phương pháp giao tiếp đơn giản hơn rất nhiều. Nếu bạn muốn xem các phương thức cụ thể này được thực hiện như thế nào, bạn có thể xem kho lưu trữ github của chúng tôi .

Vậy làm thế nào, để đơn giản việc truyền thông tin giữa các trang web trong phần mở rộng. Thay vì các tab kết nối với backgroudscript, popup như đã làm. Thì chúng tôi cho mở cửa sổ lên không có ID, điều đó có nghĩa là chỉ tham chiếu đến kênh giao tiếp dưới dạng mở một cửa số ứng dụng lên. Cho nên chúng tôi đã xử lý như sau:
chrome.extension.onconnect.addListener (port => {let source = port.name;if(port.sender.tab)source + = `- $ {port.sender.tab.id}`;}});
Bây giờ tất cả các tin nhắn đến từ cửa sổ bật lên có thể được trả lời bằng cách gọi kênh liên kết với popup
Giá như nó đơn giản như thế. Nhưng không,Nó chỉ ra rằng một phần mở rộng không thể thực sự kích hoạt popup của riêng nó. Điều này có nghĩa là nếu một trang web yêu cầu người dùng gửi TRON đến một địa chỉ thì tiện ích đó không thể mở cửa sổ bật lên của chương trình để người dùng xác nhận giao dịch.
Điều này có nghĩa là chúng tôi phải mở một cửa sổ hộp thoại để hiển thị xác nhận, nhưng điều đó đi kèm với vấn đề của chính nó.
  • Như nhiều bạn có thể đã mong đợi, việc mở một cửa sổ hộp thoại chỉ là một thuật ngữ ưa thích để mở một tab mới với kích thước được chỉ định, trong một cửa sổ mới.
  • Vấn đề với điều đó là các kênh truyền thông cho hộp thoại (mà chỉ là một thể hiện của popup ) không còn popupnhưng thay vào đó popup-123 , popup-736hoặc có thể popup-614. Đúng, nó có một tabID gây ra rất nhiều rắc rối cho chúng tôi vì nó dễ bị bỏ qua.
  • Trước tiên, chúng tôi nghĩ rằng có thể hộp thoại đang tạo một phiên bản mới của backgroundScript , đó là lý do tại sao không có dữ liệu tài khoản nào được tải. Điều đó không có ý nghĩa, mặc dù, backgroundScript là một tập lệnh duy nhất, liên tục.
  • Sau đó, chúng tôi nghĩ rằng backgroundScript đã được gọi từ popup hiện lên, đang được mở bằng tay thông qua một hộp thoại.
Không, giao tiếp chỉ hoạt động tốt trong trình duyệt bật lên.
Tôi đã hoàn toàn quên nó có một tabID. Rất may đó là một sửa chữa đơn giản:
chrome.extension.onconnect.addListener (port => { 
    let source = port.name; 
    
    if (port.sender.tab && source! == 'popup') 
        source + = `- $ {port.sender.tab.id} `; 
}});
Với điều này chúng ta có thể giao tiếp với hộp thoại giống như chúng ta có thể với popup . Chúng tôi muốn nhà nước được đồng bộ dù sao đi nữa là tiền thưởng cho chúng tôi.

API của TRONLINK




Phiên bản đầu tiên tôi luôn muốn sử dụng API cho TronLink. Máy ảo Tron là trong những ngày đầu của nó và tôi biết rằng nó sẽ dễ bị thay đổi, có nghĩa là nó có khả năng phá vỡ API của tôi.

Nếu tôi muốn thay đổi hoặc xóa các tính năng tôi phải tính toán cho các trang web bằng API cũ. Rất tiếc, tôi không thể thực hiện các thay đổi đột phá khi tiện ích mở rộng có tiềm năng có hàng nghìn trang web dựa vào nó.

Tôi quyết định rằng tôi cũng muốn cung cấp cho các nhà phát triển khả năng thêm TronLink một cách tùy biến. Nếu họ có xung đột vì bất kỳ lý do gì họ sẽ không phải xử lý việc viết lại codebase của riêng họ.

PageHook có một mục đích duy nhất: thêm API (và các dữ liệu khác) vào trang để các nhà phát triển truy cập.

Tôi muốn API như sau:
  • API TronLink, thể hiện thông tin mỗi phiên bản.
  • Môi trường TronLink thực thi (cho dù nó đang chạy hay trong quá trình sản xuất hoặc phát triển)
  • Phiên bản mở rộng TronLink (điều này có thể hữu ích cho việc phân tích hoặc báo cáo sự cố nếu chúng xảy ra)
Xử lý biến tùy chỉnh khá dễ dàng. Tôi chỉ định nghĩa tên biến với:
const scriptVariable = (window.TRON_LINK_VARIABLE || 'TronLink').toString();
May mắn thay, tôi đã thêm API trong window và cho phép tôi định nghĩa nó như sau:
window [scriptVariable] = { 
    v1: (network = 'mainnet') => new TronLink(linkedRequest, network) 
};
Như bạn có thể thấy lần lặp đầu tiên của API có hai đối số -  linkedRequestvà network. Tôi không muốn để lộ các linkedRequesttrong trang web như các nhà phát triển, vì nó có khả năng có thể phá vỡ việc thực hiện và gây ra vấn đề cho người dùng.

Mặc dù các nhà phát triển có thể lấy linkedRequestvà tạo ra các sự kiện thô theo cách thủ công nhưng nó không có lợi ích bằng việc yêu cầu họ tự nhập vào LinkedRequest, một điểm ít bị phá vỡ đối với một người mới vào thư viện.

Mục tiêu của TronLink là phơi bày càng nhiều quyền truy cập vào mạng blockchain càng tốt cho các nhà phát triển. Điều này có nghĩa là phải hỗ trợ rất nhiều chức năng khiến tôi quyết định rằng tất cả các phương thức đều phải được đặt tên. Tôi quyết định về việc sử dụng walletnodevà utils.
Nhóm TronWatch và tôi đã triển khai chức năng dưới đây:
  • ví dụ
    - sendTron
    - sendAsset
    - freeze
    - unfreeze
    - sendTransaction
    - signTransaction
    - simulateSmartContract
    - createSmartContract
    - getAccount
  • nút
    - getLatestBlock
    - getWitnesses
    - getTokens
    - getBlock
    - getTransaction
    - getAccount
  • utils
    - validateAddress
    - sunToTron
    - tronToSun
Tôi đã thêm vào các phương pháp trên với ý định rằng chúng ta sẽ có thời gian để tích hợp đầy đủ chức năng của từng phương thức, trong khi vẫn có thời gian để phát triển những ý tưởng mới trong tương lai.
TVM hiện vẫn đang trong giai đoạn phát triển, vì vậy tôi không muốn đẩy ranh giới vào thứ gì đó dễ bị thay đổi.
Khi TVM đang chạy trên thử nghiệm Tron chính thức, nhóm sẽ thêm hỗ trợ để gọi các phương thức hợp đồng cụ thể thay vì chỉ mô phỏng chúng.
Nếu bạn muốn xem một số ví dụ cơ bản về bắt đầu với TronWatch, tôi khuyên bạn nên xem trang web mẫu của chúng tôi .

Lưu ý cuối cùng trên TRONLINK

Xây dựng TronLink là một thử thách nhưng cũng là một dự án thú vị. TronWatch tin rằng chúng tôi đã mở các cánh cửa cho TVM để người dùng trải nghiệm các ứng dụng dApps trên một mạng lưới cực nhanh.
TronLink là dự án đầu tiên trong số nhiều dự án mà TronWatch sẽ làm việc. Hãy nhớ theo dõi sự trao đổi phi tập trung của chúng tôi, mà chúng tôi đang có kế hoạch mở cửa cho công chúng vào cuối quý 4 năm 2018.
Nếu bạn muốn tham gia với TronLink, chúng tôi khuyên bạn nên tham gia với chúng tôi trong kênh Telegram của chúng tôi .
Bạn cũng có thể xem qua kho lưu trữ Github để khám phá các hoạt động bên trong của ứng dụng cụ thể hơn.
Nếu bạn có bất kỳ câu hỏi nào liên quan đến TronLink hoặc TronWatch, vui lòng liên hệ với chúng tôi trên Twitter hoặc Telegram.
- Tayler King
bởi TronWatch Team


TronWatch đang hoạt động với tư cách là đại diện của Super để tài trợ cho những sáng tạo tương lai của chúng tôi

Nguồn: BTV-BitBox.vn

🥇Hãy ghi nhớ các link sau đây để tìm hiểu về TRON

✅ Kênh Telegram Cộng đồng TRON VIỆT NAM : 

✅ Website TRON VIỆT NAM :

✅ Kênh Youtube TRON VIỆT NAM cập nhật video mới :

✅ Kênh Facebook Cộng đồng TRON VIỆT NAM : 

✅ Kênh Twitter Cộng đồng TRON VIỆT NAM : 

⚠️Luôn luôn cật nhập những tin mới nhất⚠️

Nhận xét

Bài đăng phổ biến

TRON có thể dành ngôi vô địch – Đồng tiền số 1 của năm 2018

TRON nằm trong trận chiến khốc liệt giữa top 5 Altcoin đang hot nhất hiện nay

Thành viên chính thức có thể dùng USD để mua TRX trên sàn Changelly.

Người dùng oBike trở thành người đầu tiên trên thế giới kiếm tiền và đi xe trên nền tảng TRON

TRON lập kế hoạch khen thưởng: Người chiến thắng 20 000USD là ai?

Điều gì đặc biệt có thể khiến TRON mua lại BitTorrent