C-Lightning

Lightning-cli發票標籤中的最大字節大小或字元限制是多少?是否接受 UTF-8 字元?

  • December 26, 2021

我正在用 C 語言編寫一個腳本,目的是讓我的 c-lightning 錢包的使用更加方便。所以我必須指定一個字元限制(l是一個代表標籤的變數):

puts("The label(a unique string or number)?");
       char l[15];
       fgets(l, 15, stdin);
       l[strcspn(l, "\n")] = 0;

我隨意決定15不知道是否lightning-cli invoice會接受這麼長的字元串。雖然help invoice提供了一些關於標籤的資訊:

標籤必須是唯一的字元串或數字(將其視為字元串,因此“01”與“1”不同);它永遠不會透露給閃電網路上的其他節點,但可以用來查詢這張發票的狀態。

它沒有指定它的長度,也沒有指定它的字元集?標籤中是否接受UTF-8 字元,還是應該只使用ASCII字元集?標籤的最大大小/字元數是多少?

如果您查看原始碼,您可以在以下位置找到用於儲存發票的 SQLite3 數據庫的數據庫架構:https ://github.com/ElementsProject/lightning/blob/426ff0abfff8b080b22095b9f0b670c7192f54ea/wallet/db.c#L185

這表明標籤欄位的類型是 TEXT。根據 SQLite3 文件,這意味著:

文本。該值是一個文本字元串,使用數據庫編碼(UTF-8、UTF-16BE 或 UTF-16LE)儲存。

當然你需要檢查一下閃電是否也能處理這麼長的字元串。標籤儲存在invoice_details其中定義為:

<https://github.com/ElementsProject/lightning/blob/335ef3fb69f923f6f30213f68881d10ee6d977ed/wallet/wallet.h#L777>

從那裡你可以看到它的類型* json_escape來自 rusty 的 ccan 庫,定義在:

<https://github.com/ElementsProject/lightning/blob/ade10e7fc4dacbb9d635b05152c7dc38c0896ce7/ccan/ccan/json_escape/json_escape.h>

那裡說:

/* Type differentiation for a correctly-escaped JSON string */
struct json_escape {
   /* NUL terminated string. */
   char s[1];
};

/**
* json_escape - escape a valid UTF-8 string.
* @ctx: tal context to allocate from.
* @str: the string to escape.
*
* Allocates and returns a valid JSON string (without surrounding quotes).
*/
struct json_escape *json_escape(const tal_t *ctx, const char *str TAKES);

據我了解,這確實表明只要您有記憶體和磁碟,您就應該能夠儲存任意長度的 UTF-8 字元串。

引用自:https://bitcoin.stackexchange.com/questions/111447