5.馬賽克
本章介紹 Mosaic 設置及其生成方式。 在 Symbol 中,令牌被稱為馬賽克。
根據維基百科的描述,令牌(Token)是“各種形狀的泥製品,直徑約為1厘米,出土於公元前8000年至公元前3000年的美索不達米亞層。”另一方面,馬賽克(Mosaic)是“一種裝飾藝術技巧,通過將小塊材料組裝嵌入以形成圖像或圖案。石材、陶瓷(馬賽克瓷磚)、有色和無色玻璃、貝殼和木材用於裝飾建築或工藝品的地面和牆壁。” 在 Symbol 中,馬賽克可以被認為是代表 Symbol 區塊鏈創建的生態系統各個方面的各種組件。
5.1 馬賽克生成
對於馬賽克生成,定義要創建的馬賽克。
supplyMutable = true; //Availability of supply changes
transferable = false; //Transferability to third parties
restrictable = true; //Availability of restriction settings
revokable = true; //Revocability from the issuer
//Mosaic definition
nonce = sym.MosaicNonce.createRandom();
mosaicDefTx = sym.MosaicDefinitionTransaction.create(
undefined,
nonce,
sym.MosaicId.createFromNonce(nonce, alice.address), //Mosaic ID
sym.MosaicFlags.create(supplyMutable, transferable, restrictable, revokable),
2, //Divisibility:Divisibility
sym.UInt64.fromUint(0), //Duration:Effective date
networkType,
);
馬賽克標誌如下。
MosaicFlags {
supplyMutable: false, transferable: false, restrictable: false, revokable: false
}
可以指定供應變更的許可、向第三方的可轉讓性、Mosaic 全球限制的應用和發行人的可撤銷性。 一旦設置這些屬性,以後就不能更改。
可分割性
可被整除性(Divisibility)決定了可以測量數量的小數位數。數據以整數值保存。
divisibility:0 = 1
divisibility:1 = 1.0
divisibility:2 = 1.00
持續時間
如果指定為 0,則不能再細分為更小的單元。 如果設置了馬賽克有效期,有效期過後數據不會消失。 請注意,每個帳戶最多可以擁有 1,000 個馬賽克。
接下來,更改數量。
//Mosaic change
mosaicChangeTx = sym.MosaicSupplyChangeTransaction.create(
undefined,
mosaicDefTx.mosaicId,
sym.MosaicSupplyChangeAction.Increase,
sym.UInt64.fromUint(1000000),
networkType,
);
如果supplyMutable:false,只有當整個馬賽克的供應量在發行者的賬戶中時,數量才能被更改。 如果整除率 > 0,則將其定義為最小單位為 1 的整數值。 (如果要創建 1.00 可整除性,請指定 100:2)
馬賽克供應量更改操作如下所示。
{0: 'Decrease', 1: 'Increase'}
如果要增加它,請指定增加。 將上面的兩個事務合併成一個聚合事務。
aggregateTx = sym.AggregateTransaction.createComplete(
sym.Deadline.create(epochAdjustment),
[
mosaicDefTx.toAggregate(alice.publicAccount),
mosaicChangeTx.toAggregate(alice.publicAccount),
],
networkType,
[],
).setMaxFeeForAggregate(100, 0);
signedTx = alice.sign(aggregateTx, generationHash);
await txRepo.announce(signedTx).toPromise();
請注意,聚合交易的一個特點是它會嘗試更改尚不存在的馬賽克的數量。 排列時,如果沒有不一致,則可以在單個塊內毫無問題的處理它們。
確認
確認創建馬賽克的賬戶持有的馬賽克信息。
mosaicRepo = repo.createMosaicRepository();
accountInfo.mosaics.forEach(async (mosaic) => {
mosaicInfo = await mosaicRepo.getMosaic(mosaic.id).toPromise();
console.log(mosaicInfo);
});
示例演示
> MosaicInfo {version: 1, recordId: '622988B12A6128903FC10496', id: MosaicId, supply: UInt64, startHeight: UInt64, …}
> MosaicInfo
divisibility: 2 //Divisibility
duration: UInt64 {lower: 0, higher: 0} //Duration
> flags: MosaicFlags
restrictable: true //Availability of restriction settings
revokable: true //Revocability from the issuer
supplyMutable: true //Availability of supply changes
transferable: false //Transferability to third parties
> id: MosaicId
id: Id {lower: 207493124, higher: 890137608} //MosaicID
ownerAddress: Address {address: 'TBIL6D6RURP45YQRWV6Q7YVWIIPLQGLZQFHWFEQ', networkType: 152} //Issure address
recordId: "62626E3C741381859AFAD4D5"
supply: UInt64 {lower: 1000000, higher: 0} //Total supply
5.2 馬賽克轉移
傳輸創建的馬賽克。 剛接觸區塊鏈的人常常把馬賽克傳輸想像成“將存儲在一個客戶端的馬賽克發送到另一個客戶端”,但馬賽克信息始終在所有節點之間共享和同步,而不是將馬賽克信息傳輸到目的地。 更準確地說,它是指通過向區塊鏈“發送交易”來重新組合賬戶之間代幣餘額的操作。
//Creating a receiving account
bob = sym.Account.generateNewAccount(networkType);
tx = sym.TransferTransaction.create(
sym.Deadline.create(epochAdjustment),
bob.address, //Destination address
// Transfer mosaic list
[
new sym.Mosaic(
new sym.MosaicId("3A8416DB2D53B6C8"), //TestnetXYM
sym.UInt64.fromUint(1000000), //1XYM(divisibility:6)
),
new sym.Mosaic(
mosaicDefTx.mosaicId, // Mosaic created in 5.1.
sym.UInt64.fromUint(1), // Amount:0.01(InCaseDivisibility:2)
),
],
sym.EmptyMessage,
networkType,
).setMaxFee(100);
signedTx = alice.sign(tx, generationHash);
await txRepo.announce(signedTx).toPromise();
傳輸馬賽克列表
可以在單個事務中傳輸多個馬賽克。 要傳輸 XYM,請指定以下馬賽克 ID。
- 主網:6BED913FA20223F8
- 測試網:3A8416DB2D53B6C8
帳戶
所有小數點也指定為整數。 XYM 可整除 6,因此指定為 1XYM=1000000。
交易確認
txInfo = await txRepo
.getTransaction(signedTx.hash, sym.TransactionGroup.Confirmed)
.toPromise();
console.log(txInfo);
示例演示
> TransferTransaction
deadline: Deadline {adjustedValue: 12776690385}
maxFee: UInt64 {lower: 19200, higher: 0}
message: RawMessage {type: -1, payload: ''}
> mosaics: Array(2)
> 0: Mosaic
amount: UInt64 {lower: 1, higher: 0}
> id: MosaicId
id: Id {lower: 207493124, higher: 890137608}
> 1: Mosaic
amount: UInt64 {lower: 1000000, higher: 0}
> id: MosaicId
id: Id {lower: 760461000, higher: 981735131}
networkType: 152
payloadSize: 192
recipientAddress: Address {address: 'TAR6ERCSTDJJ7KCN4BJNJTK7LBBL5JPPVSHUNGY', networkType: 152}
signature: "7C4E9E80D250C6D09352FB8EC80175719D59787DE67446896A73AABCFE6C420AF7DD707E6D4D2B2987B8BAD775F2989DCB6F738D39C48C1239FC8CC900A6740D"
signer: PublicAccount {publicKey: '0E5C72B0D5946C1EFEE7E5317C5985F106B739BB0BC07E4F9A288417B3CD6D26', address: Address}
> transactionInfo: TransactionInfo
hash: "DE479C001E9736976BDA55E560AB1A5DE526236D9E1BCE24941CF8ED8884289E"
height: UInt64 {lower: 326922, higher: 0}
id: "626270069F1D5202A10AE93E"
index: 0
merkleComponentHash: "DE479C001E9736976BDA55E560AB1A5DE526236D9E1BCE24941CF8ED8884289E"
type: 16724
version: 1
可以看到在TransferTransaction的馬賽克中轉了兩種類型的馬賽克。 您還可以在 TransactionInfo 中找到有關已批准區塊的信息。
5.3 使用提示
存在證明
上一章解釋了交易的存在證明。 一個賬戶創建的轉賬指令可以作為不可磨滅的記錄留下,這樣就可以創建一個絕對一致的賬本。 由於為所有賬戶累積了“絕對的、不可磨滅的交易指令”,因此每個賬戶可以證明自己擁有的馬賽克。 由於為所有賬戶累積了“不可磨滅的交易指令”,因此每個賬戶可以證明自己擁有的馬賽克。 (在本文檔中,擁有被定義為“有能力隨意放棄的狀態”。稍微離題,但“有能力隨意放棄的狀態”的意義在於,數字數據的所有權至少在日本尚未得到法律承認,而一旦您知道了這些數據,就無法向他人證明您已經自願遺忘了它。區塊鏈允許您清楚地指示放棄這些數據,但我將把詳細信息留給法律專家。)
NFT (非同質化代幣)
通過將代幣總供應量限制為 1 並將 supplyMutable 設置為 false,只能發行一個代幣,並且永遠不會再存在。
馬賽克存儲有關發出馬賽克的帳戶地址的信息,並且該數據不能被篡改。 因此,來自發出馬賽克的賬戶的交易可以被視為元數據。
請注意,還有一種方法可以將元數據註冊到 馬賽克,如第 7 章所述,可以通過註冊帳戶和 馬賽克 發布者的多重簽名來更新。
創建 NFT 的方法有很多種,下面給出了一個過程示例(執行時請適當設置 nonce 和 flag 信息)。
supplyMutable = false; //Availability of supply changes
//Mosaic definition
mosaicDefTx = sym.MosaicDefinitionTransaction.create(
undefined,
nonce,
mosaicId,
sym.MosaicFlags.create(supplyMutable, transferable, restrictable, revokable),
0, //Divisibility:Divisibility
sym.UInt64.fromUint(0), //Duration:Indefinite
networkType,
);
//Fixed mosaic quantity
mosaicChangeTx = sym.MosaicSupplyChangeTransaction.create(
undefined,
mosaicId,
sym.MosaicSupplyChangeAction.Increase, //Increase
sym.UInt64.fromUint(1), //Amount1
networkType,
);
//NFTdata
nftTx = sym.TransferTransaction.create(
undefined, //Deadline:Duration
alice.address,
[],
sym.PlainMessage.create("Hello Symbol!"), //NFTdata
networkType,
);
//Generating mosaic and aggregating NFT data and registering them in blocks.
aggregateTx = sym.AggregateTransaction.createComplete(
sym.Deadline.create(epochAdjustment),
[
mosaicDefTx.toAggregate(alice.publicAccount),
mosaicChangeTx.toAggregate(alice.publicAccount),
nftTx.toAggregate(alice.publicAccount),
],
networkType,
[],
).setMaxFeeForAggregate(100, 0);
馬賽克信息中包含馬賽克生成時的區塊高度和創建賬戶,因此通過搜索同一區塊內的交易,可以檢索到與馬賽克關聯的NFT數據。 可以檢索與同一塊中的交易關聯的 NFT 數據。
注意事項
如果馬賽克的創建者擁有全部數量,則可以更改總供應量。 如果將數據拆分成交易記錄,則不可篡改,但可以追加數據。 在管理 NFT 時,請注意妥善管理,例如嚴格管理或丟棄馬賽克創建者的私鑰。
可撤銷的積分服務操作。
將 transferable 設置為 false 可以限制轉售,使得可以定義出更不易受到結算法律或規定影響的積分。 將 revokable 設置為 true 可以啟用集中管理的積分服務操作,用戶無需管理私鑰即可收集使用的金額。
transferable = false; //Transferability to third parties
revokable = true; //Refundability from the issuer