Bytom的鏈式交易和花費未確認的交易

2021-09-24 07:35:23 字數 2290 閱讀 3238

當我們基於比原做應用的時候,在構建交易過程中會遇到以下兩種情況。多個位址向乙個位址轉賬,還有一種就是從乙個位址分批次向多個位址轉賬。那我們今天就來介紹一下這兩種交易構建的具體流程,以及貼出具體實現的**。

當我們從多個錢包位址一次性轉到乙個位址的時候,為了提高使用者體驗。我們可以選擇鏈式交易,把多筆交易一次性打包。那我們下面就來看一下鏈式交易的流程。

接下來我們來看一下build-transaction介面的**實現過程,**如下:

// post /build-chain-transactions

func (a *api) buildchaintxs(ctx context.context, buildreqs *buildrequest) response

return newsuccessresponse(tmpls)

}複製**

核心的實現方法,buildtxs方法的實現如下:

func (a *api) buildtxs(ctx context.context, req *buildrequest) (*txbuilder.template, error) 

//合併處理交易輸入輸出的型別組合

actions, err := a.mergespendactions(req)

if err != nil

//構建一筆新的交易模板

builder := txbuilder.newbuilder(time.now().add(req.ttl.duration))

//宣告交易模板

tpls := *txbuilder.template{}

//遍歷交易的輸入輸出型別組合

for _, action := range actions else

if err != nil

}//構建交易

tpl, _, err := builder.build()

if err != nil

return tpls, nil

}複製**

build方法的實現過程:

// build build transactions with template

func (b *templatebuilder) build() (*template, *types.txdata, error)

}tpl := &template{}

tx := b.base

if tx == nil

}if b.timerange != 0

// add all the built outputs.

// add all the built inputs and their corresponding signing instructions.

for i, in := range b.inputs }}

tpl.transaction = types.newtx(*tx)

tpl.fee = calculatetxfee(tpl.transaction)

return tpl, tx, nil

}複製**

下面我們來介紹一下花費未確認的交易,我們首先介紹一下什麼是花費未確認的交易。我們知道utxo模型在交易的過程中,如果交易未打包確認。再進行第二筆轉賬就會存在「雙花」問題,就不能再發起交易或者需要等一段時間才能再發起一筆交易。如果使用花費未確認的交易就可以避免這個問題。

那麼花費未確認的交易實現機制是什麼樣的呢?我們在建立第一筆交易的時候,會找零,此時交易是未確認的狀態。找零存在交易池中,我們發第二筆交易的時候就直接使用在交易池中找零位址裡面的資產。

那我們來看一下花費未確認交易的**實現過程,花費過程結構體如下:

type spendaction struct 

複製**

方法如下:

// mergespendaction merge common assetid and accountid spend action

func mergespendaction(actions txbuilder.action) txbuilder.action

spendactionmap := make(map[string]*spendaction)

//遍歷交易的輸入輸出型別組合

for _, act := range actions else

default:}}

return resultactions

}複製**

以太坊如何清除已發出未打包的交易

當我們傳送一筆交易時,支付的手續費較低,導致礦工不願意打包交易,那麼此時我們該怎麼辦呢?這裡就用到了nonce覆蓋特性,同樣的交易我們把手續費提高再次傳送即可。需要注意的前提條件是nonce值由自己維護。如果nonce值是讓geth節點自動生成,那麼再次傳送時就需要構造之前交易所使用的nonce進行...

以太坊如何清除已發出未打包的交易

技術群中經常被同學問到,為什麼發出的交易遲遲不被打包,我想把它給取消了,改怎麼做?今天就帶大家分析一下如何解決此類問題。主要分兩種情況,分別有兩種不同的解決方案。當我們傳送一筆交易時,支付的手續費較低,導致礦工不願意打包交易,那麼此時我們該怎麼辦呢?這裡就用到了nonce覆蓋特性,同樣的交易我們把手...

期貨交易和現貨交易的區別

交易與現貨交易有相同的地方,如都是一種交易方式 都是真正意義上的買賣 涉及商品所有權的轉移等,不同的地方有以下幾點 1 買賣的直接物件不同。現貨交易買賣的直接物件是商品本身,有樣品 有實物 看貨定價。而 交易買賣的直接物件是 合約,是買進或賣出多少手或多少張 合約。2 交易的目的不同。現貨交易是一手...