1. ?概念
側(cè)鏈這一術(shù)語(yǔ)在Adam Back等人2014年左右的論文《用楔入式側(cè)鏈實(shí)現(xiàn)區(qū)塊鏈的創(chuàng)新》被首次討論蒜魄。論文描述了“雙向楔入側(cè)鏈”,這種機(jī)制通過(guò)證明你已經(jīng)“鎖定”了一些你擁有的貨幣,從而允許你在一個(gè)側(cè)鏈內(nèi)操作一些其他的貨幣驼唱。 這里要澄清一個(gè)誤解见擦。側(cè)鏈能增加規(guī)模簿透,但是這不意味著擴(kuò)展性沼头。側(cè)鏈在提升擴(kuò)展性上并不比增加區(qū)塊體積優(yōu)秀。側(cè)鏈帶來(lái)的是實(shí)驗(yàn)的能力书劝。能夠建立以不同的进倍,甚至可能更好的技術(shù)為基礎(chǔ)的網(wǎng)絡(luò)。
2. 術(shù)語(yǔ)
checkpoint:檢查點(diǎn)购对,側(cè)鏈定期向主鏈發(fā)送merkle root
two-way-peg:雙向楔入猾昆,在主鏈鎖定一部分token,而允許在側(cè)鏈擁有其他的token
zk-SNARKs:零知識(shí)證明
3. ?plasma
Plasma是參考雷電網(wǎng)絡(luò)骡苞,并將其拓展到任何Tx的layer 2 擴(kuò)展方案垂蜗,目的是引導(dǎo)大家只將安全級(jí)別很高的部分放置在main chain上,其他低安全級(jí)別的部分放置在side chain/off-chain上面完成解幽,參考:https://www.bitrates.com/news/p/plasma-design-space-for-custom-blockchains-extending-off-the-ethereum-blockchain?
主鏈和側(cè)鏈的交互
通過(guò)smart contract交互
Plasma內(nèi)部是一個(gè)tree of blockchain
Plasma MVP
參考
http://www.reibang.com/p/b79eabd4e2a1
https://blog.csdn.net/ITleaks/article/details/82863285
https://ethresear.ch/t/minimal-viable-plasma/426
關(guān)鍵點(diǎn):
1. ?使用merkletree和 UTXO的存儲(chǔ)方式
2. ?Priority queue:提交exit的時(shí)候先放入鏈中贴见,先入的先處理,防止用戶退鏈的時(shí)候躲株,operator也提出退鏈
3. ? 利于攸關(guān)者的挑戰(zhàn):所有的退出請(qǐng)求都在隊(duì)列中保留7天片部,如果有人挑戰(zhàn)成功則退出失敗
數(shù)據(jù)結(jié)構(gòu)如下:
Block 只包含hash root和時(shí)間戳
struct PlasmaBlock {
? ? ?bytes32 root;
? ? uint256?timestamp;
}
transaction 是經(jīng)典的UTXO格式
class Transaction(rlp.Serializable): fields = [
('blknum1', big_endian_int),
('txindex1', big_endian_int),
('oindex1', big_endian_int),
('blknum2', big_endian_int),
('txindex2', big_endian_int),
('oindex2', big_endian_int),
('cur12', utils.address),
('newowner1', utils.address),
('amount1', big_endian_int),
('newowner2', utils.address),
('amount2', big_endian_int),
('sig1', binary),
('sig2', binary),]
SubmitBlock: 完成合約內(nèi)交易后,child chain(plasma contract作為root chain霜定, 其他區(qū)塊鏈作為child chain來(lái)實(shí)現(xiàn))調(diào)用該接口提交交易的hash root 和timestamp到plasma block chain档悠。
Deposit: 實(shí)現(xiàn)從主鏈向合約轉(zhuǎn)token的操作,計(jì)算操作的hash root望浩,寫入plasma block辖所,如下:
bytes32 root = keccak256(abi.encodePacked(msg.sender, address(0), msg.value));
startDepositExit:存款人從合約中提款到主鏈,輸入block index和amount后計(jì)算hash 和plasma block中的root比對(duì)磨德,如果一致加入到exit 鏈中缘回。
startExit:如果存款人轉(zhuǎn)賬給A,A提款到主鏈典挑,需要攜帶交易所在的block num和merkle proof切诀,合約計(jì)算后如果一致加入到exit鏈中
challengeExit:挑戰(zhàn)提款,如果之前A轉(zhuǎn)賬給B后搔弄,A就發(fā)起了startExit/startDepositExit,由于合約無(wú)法校驗(yàn)最終的token屬于誰(shuí)幅虑,所以需要先放入exitPriority queue,等待7天如果沒人挑戰(zhàn)就退出顾犹,否則B發(fā)現(xiàn)后(通過(guò)監(jiān)聽退出消息得知)使用該接口,輸入A轉(zhuǎn)賬B的交易信息后灯变,合約校驗(yàn)無(wú)誤后震贵,刪除A的退出請(qǐng)求。
Plasma CASH
參考
https://blog.csdn.net/ITleaks/article/details/83106336
https://ethresear.ch/t/plasma-cash-plasma-with-much-less-per-user-data-checking/1298
關(guān)鍵點(diǎn):
用戶調(diào)用deposit將主鏈的ETH, ERC20, ERC721代幣生成coin郁妈,coin類似房產(chǎn),只能整體交易绍申,沒法分割噩咪,用戶在子鏈通過(guò)交易修改coin的所有權(quán)(更改coin的owner),可以簡(jiǎn)化驗(yàn)證极阅,因?yàn)橹荒茯?yàn)證交易是否存在胃碾,沒有每個(gè)用戶的余額信息,所以視為整體筋搏,不把這個(gè)依賴challenge來(lái)保證仆百。
使用sparse merkle-tree(相比標(biāo)準(zhǔn)的merkletree主要的優(yōu)勢(shì)是除了可以證明存在,還可以證明不存在奔脐,這樣可以防止operator 構(gòu)造假的block):https://medium.com/@kelvinfichter/whats-a-sparse-merkle-tree-acda70aeb837 和coin的存儲(chǔ)方式
數(shù)據(jù)結(jié)構(gòu)如下:
struct Coin {
Mode mode;
State state;
address?owner; // who owns that nft
address contractAddress; // which contract does the coin belong to
Exit exit;
uint256?uid;
uint256?denomination;
uint256?depositBlock;
}
類似MVP的PlasmaBlock
struct ChildBlock {
bytes32 root;
uint256?createdAt;
}
transaction結(jié)構(gòu)不同于MVP俄周,包含了coin的索引slot
struct TX {
uint64 slot;
address?owner;
bytes32?hash;
uint256?prevBlock;
uint256?denomination;
}
submitBlock(bytes32 root):完成合約內(nèi)交易后,child chain(plasma contract作為root chain髓迎, 其他區(qū)塊鏈作為child chain來(lái)實(shí)現(xiàn))調(diào)用該接口提交交易的hash root 和timestamp到plasma block chain峦朗。
deposit:實(shí)現(xiàn)從主鏈向合約轉(zhuǎn)token的操作,相比較MVP增加了uid的參數(shù)用來(lái)標(biāo)識(shí)token的類型排龄,需要將該種coin保存在合約中甚垦,并計(jì)算操作的hash root,寫入child block
startExit:不同于MVP涣雕,需要攜帶之前的該coin的交易和現(xiàn)在的交易艰亮,校驗(yàn)這兩個(gè)交易都存在后,將其放入隊(duì)列當(dāng)中挣郭,等待7天迄埃,如果沒有挑戰(zhàn),就可以通過(guò)下面的withdraw方法取出兑障,如果有挑戰(zhàn)且成功侄非,則將獎(jiǎng)勵(lì)發(fā)放給揭發(fā)者。相比MVP安全性更高一些
withdraw:在startExit之后沒有挑戰(zhàn)或挑戰(zhàn)失敗后流译,將token取出到主鏈逞怨,?
challengeBefore:提出一個(gè)比退出區(qū)塊早的證據(jù),只能證明提出者的來(lái)源的來(lái)源是自己福澡。
respondChallengeBefore:針對(duì)challenge叠赦,如果可以證明之后又轉(zhuǎn)給了自己就是勝利。
challengeBetween:可以證明提出者的來(lái)源有問題革砸。直接懲罰
challengeAfter:可以證明提出者后面已經(jīng)消費(fèi)除秀。直接懲罰
關(guān)于 RootStock
參考
https://github.com/rsksmart/rskj/wiki
采用側(cè)鏈+公證人的方式實(shí)現(xiàn)糯累,流程如下:
用戶A轉(zhuǎn)賬到federator賬戶(多簽賬戶)
Federation賬戶通過(guò)錢包內(nèi)置功能調(diào)用rsk-chain的bridge的智能合約的方法(receiveHeaders和registerBtcTransaction)將SPV證明發(fā)送過(guò)去
Rsk-chain,收到receiveHeaders之后保存header信息册踩,建立一個(gè)BTC的header鏈(類似錢包)泳姐,收到registerBtcTransaction后解鎖對(duì)應(yīng)固定匯率(1:10)的SBTC,并使用用戶A的公鑰生成賬戶(這樣用戶A可以直接控制)暂吉,將SBTC存入到該賬戶下
用戶A想要從rsk-chain取回BTC胖秒,需要調(diào)用智能合約方法releaseBtc,銷毀對(duì)應(yīng)數(shù)量的SBTC
在federator的BTC賬戶下投票(錢包是通過(guò)注冊(cè)的消息得知)慕的,確定將對(duì)應(yīng)余額返回給用戶A的BTC賬戶阎肝。
可以看出通信的關(guān)鍵在于federator賬戶的錢包。
關(guān)于BTC Relay
請(qǐng)參考
https://github.com/ethereum/btcrelay
BTC Relay是帶有Bitcoin SPV錢包功能的以太坊智能合約业稼,包括 Relayers社區(qū)成員:Relayers為BTC Relay提供新的比特幣區(qū)塊頭(header)盗痒,當(dāng)交易在區(qū)塊鏈進(jìn)行驗(yàn)證或者區(qū)塊頭被檢索的時(shí)候蚂蕴,Relayer會(huì)獲得一筆手續(xù)費(fèi)作為獎(jiǎng)勵(lì)低散,Relayer提交區(qū)塊頭的這種循環(huán)——然后處理比特幣支付和獎(jiǎng)勵(lì)Relayer手續(xù)費(fèi)的應(yīng)用程序——使系統(tǒng)能夠自立和自治,如下圖:
BTC-Relay使用場(chǎng)景舉例
1. Alice和Bob同意使用在以太坊上的BTCSwap合約來(lái)進(jìn)行交易骡楼,Alice要買Bob的eth熔号,Bob先把他的 eth發(fā)送到BTCSwap合約?
2. Alice向Bob發(fā)送bitcoin,?
3. Alice通過(guò)bitcoin的交易信息以及BTCSwap合約地址來(lái)調(diào)用btcrelay.relayTx()鸟整,btcrelay通過(guò)verifyTx接口驗(yàn)證這筆交易通過(guò)后就觸發(fā)BTCSwap合約里面的processTransaction方法
4. BTCSwap合約在被觸發(fā)后確認(rèn)這個(gè)btcrelay地址是一個(gè)合法地址引镊,然后釋放之前Bob的eth
大致流程圖如下:
可以看出該方案中,bitcoin和ethereum的通信時(shí)依靠轉(zhuǎn)帳者調(diào)用合約實(shí)現(xiàn)的篮条,并且嚴(yán)重依賴relayer不斷通過(guò)bitcoin的header弟头。