上一篇文章介紹了Bitcoin Computer的基本原理和特點,本文介紹Bitcoin Computer如何對位元幣進行操作,
Bitcoin Computer的合約還有一個保留成員變數_amount,這個成員變數用于控制合約所在輸出的位元幣數量,單位為聰,結合上一篇講到的另一個保留成員變數_owners,就可以實作位元幣轉賬了,
鈔票合約決議
我們來看一個鈔票合約的例子,
import Computer from 'bitcoin-computer';
class Cash {
constructor(amount) {
this._amount = amount
}
transfer(to) {
this._owners = [to]
}
}
(async () => {
const computerA = new Computer.default({
seed: 'the mnemonic words',
chain: 'BSV',
network: 'testnet'
});
const computerB = new Computer.default({
seed: 'different mnemonic words',
chain: 'BSV',
network: 'testnet'
});
let cash = await computerA.new(Cash, [1000]);
console.log(cash);
await cash.transfer(computerB.db.wallet.getPublicKey().toString());
console.log(cash);
cash = await computerB.sync(cash._rev);
await cash.transfer(computerA.db.wallet.getPublicKey().toString());
console.log(cash);
})();
- 定義一個鈔票合約,建構式的引數對
_amount進行初始化,這在合約部署時確定了對應output的聰數,transfer方法相當于把鈔票的使用權轉給誰, - 用兩組不同的助記詞定義兩個
Computer實體,用于更換鈔票的所屬權, - 用
computerA部署合約,面額1000聰,此時所屬權歸computerA, - 呼叫
transfer方法把鈔票所有權轉給computerB, computerB把合約同步下來,再轉回給computerA,
合約部署之后的cash變數值如下:
Cash {
_amount: 1000,
_id: '3323850d869658f5a89b832d359c1cbb308caa3ff2a4e19c28e837878a8f31ad:0',
_rev: '3323850d869658f5a89b832d359c1cbb308caa3ff2a4e19c28e837878a8f31ad:0',
_rootId: '3323850d869658f5a89b832d359c1cbb308caa3ff2a4e19c28e837878a8f31ad:0'
}
_amount變數的值為1000,那么該輸出里也應該有1000聰,查看區塊瀏覽器,發現確實如此,
另外,腳本輸出中多簽名的公鑰為03367b59cc6ba5cdb93b3bdc61c7018655462251b3608383c5a1b4adcf5f1bcc1f,同時javascript創建實體的代碼也附在了腳本中,上一篇文章中我們已經解釋過了,
computerA呼叫transfer方法后,cash變數值如下:
Cash {
_amount: 1000,
_id: '3323850d869658f5a89b832d359c1cbb308caa3ff2a4e19c28e837878a8f31ad:0',
_rev: '2db31d5718b491d5bfb69c8acdf7b952571c547653020f2d5b382fdd00156b12:0',
_rootId: '3323850d869658f5a89b832d359c1cbb308caa3ff2a4e19c28e837878a8f31ad:0',
_owners: [
'02c9788a60264523ba77500e19a0b2626c9b09b25daa16cfee09b4e1135d610c90'
]
}
查看區塊鏈瀏覽器,合約輸出里依然保持了1000聰,但多簽名的公鑰已經改為02c9788a60264523ba77500e19a0b2626c9b09b25daa16cfee09b4e1135d610c90,相當于解鎖權已經給了computerB,
computerB把合約資料同步過來,再呼叫transfer方法轉給computerA,cash變數值如下:
Cash {
_amount: 1000,
_rev: '258f09ca6649a4c7e1e980df2e1bf7467f48b815b3008fcc4701730c6ab66837:0',
_id: '3323850d869658f5a89b832d359c1cbb308caa3ff2a4e19c28e837878a8f31ad:0',
_rootId: '3323850d869658f5a89b832d359c1cbb308caa3ff2a4e19c28e837878a8f31ad:0',
_owners: [
'03367b59cc6ba5cdb93b3bdc61c7018655462251b3608383c5a1b4adcf5f1bcc1f'
]
}
查看區塊鏈瀏覽器,合約輸出還是1000聰,多簽名的公鑰又改回了03367b59cc6ba5cdb93b3bdc61c7018655462251b3608383c5a1b4adcf5f1bcc1f,相當于解鎖權又還給了computerA,
通過這樣一個合約,大家就理解_amount的作用了:決定合約輸出的聰數,
合約手續費
大家可能會有個疑問,1000聰轉來轉去沒變,那轉賬手續費是誰出的?可以在區塊瀏覽器中查看前面幾筆轉賬,觀察可以發現,手續費是由執行合約的Computer示例出的,即:
- 合約部署時,由
computerA出手續費,同時也出了1000聰放到合約輸出中,出錢的地址為mjg7nQ4VuJ3rTws8QFAD3NMMs1YgtzDm7C,也就是公鑰03367b59cc6ba5cdb93b3bdc61c7018655462251b3608383c5a1b4adcf5f1bcc1f對應的地址, computerA呼叫合約的transfer方法時,手續費也是從自己的地址mjg7nQ4VuJ3rTws8QFAD3NMMs1YgtzDm7C出的,computerB呼叫合約的transfer方法是,手續費從computerB的地址mpkhoZmfrxAAnU5mAv5yKcY83pYqWxh6jT轉出,也就是公鑰02c9788a60264523ba77500e19a0b2626c9b09b25daa16cfee09b4e1135d610c90對應的地址,
也就是說,手續費是由執行合約的Computer實體的P2PKH地址出,
從合約轉出部分位元幣
前面我用把1000聰面額的cash全面額轉出,那是否可以部分轉出呢?也是可以的,我們看如下程式:
import Computer from 'bitcoin-computer';
class Cash {
constructor(amount) {
this._amount = amount
}
transfer(amount, to) {
this._amount = amount;
this._owners = [to]
}
}
(async () => {
const computerA = new Computer.default({
seed: 'the mnemonic words',
chain: 'BSV',
network: 'testnet'
});
const computerB = new Computer.default({
seed: 'different mnemonic words',
chain: 'BSV',
network: 'testnet'
});
let cash = await computerA.new(Cash, [2000]);
await cash.transfer(1000, computerB.db.wallet.getPublicKey().toString());
console.log(cash);
})();
對Cash合約的代碼進行了改進,transfer方法允許攜帶amount引數來明確轉多少聰,
computerA向合約中部署了2000聰,但只轉給了computerB1000聰,通過區塊鏈瀏覽器可以看到,這次transfer執行操作的tx把剩下的幣轉到了computerA控制的地址mjg7nQ4VuJ3rTws8QFAD3NMMs1YgtzDm7C中,也就是說轉到了合約執行者的地址,
同時,還可以看到,這筆轉賬的手續費是從部署到合約中的2000聰里出的,
總結
Bitcoin Computer通過保留成員變數_amount,可以對合約輸出中的位元幣數進行控制,結合_owners變數,可以完成對位元幣的轉賬,
下一篇我們將介紹Bitcoin Computer的token方案,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/204939.html
標籤:其他
