交易的發起一般通過呼叫rpc介面實現,eth原始碼本身提供了相關api,位於原始碼的ethereum/go-ethereum的internal包中
// sendtransaction creates a transaction for the given argument, sign it and submit it to the
// transaction pool.
func (s *publictransactionpoolapi) sendtransaction(ctx context.context, args sendtxargs)
(common.hash, error)
//a.根據傳送者位址找出對應錢包用於簽名
wallet, err := s.b.accountmanager(
).find(account)
if err != nil , err
}if args.nonce == nil
// set some sanity defaults and terminate on failure
if err := args.setdefaults(ctx, s.b)
; err != nil , err
} // assemble the transaction and sign with the wallet
//b.處理原生交易資料
tx := args.totransaction(
) var chainid *big.int
if config := s.b.chainconfig(
); config.iseip155(s.b.currentblock(
).number(
)) //c.對交易進行簽名
signed, err := wallet.signtx(account, tx, chainid)
if err != nil , err
} //d.提交交易
return submittransaction(ctx, s.b, signed)
}
func (args *sendtxargs) totransaction(
) *types.transaction
else
if args.input != nil
// 接收者位址為空時,即為建立合約交易
if args.to == nil
// 此處為普通交易
return types.newtransaction(uint64(*args.nonce), *args.to, (*big.int)
(args.value), uint64(*args.gas), (*big.int)
(args.gasprice), input)
}
// signtx signs the given transaction with the requested account.
func (ks *keystore) signtx(a accounts.account, tx *types.transaction, chainid *big.int)
(*types.transaction, error)
// depending on the presence of the chain id, sign with eip155 or homestead
if chainid != nil
return types.signtx(tx, types.homesteadsigner, unlockedkey.privatekey)
}
…待續 以太坊原始碼分析 交易的執行
以太坊是乙個執行智慧型合約的平台,被稱作可程式設計的區塊鏈,允許使用者將編寫的智慧型合約部署在區塊鏈上執行。而執行合約的主體便是以太坊虛擬機器 evm 區塊 交易 合約 區塊鏈由區塊 block 組成,而區塊中打包一定數量的交易 transaction 交易可能是乙個單純的轉賬操作,也可能是呼叫乙個...
以太坊原始碼 交易(一)
交易是區塊鏈中最基本也是最核心的乙個概念,在以太坊中,交易更是重中之重,因為以太坊是乙個智慧型合約平台,以太坊上的應用都是通過智慧型合約與區塊鏈進行互動,而智慧型合約的執行是由交易觸發的,沒有交易,智慧型合約就是一段死的 可以說在以太坊中,一切都源於交易。下面就來看看在以太坊中交易是什麼樣的,交易裡...
12 以太坊原始碼分析 12 交易資料分析
交易的資料結構定義在core.types.transaction.go中,結構如下 type transaction struct交易的結構體中只有乙個data欄位,是txdata型別的。其他的hash,size,from都是快取。txdata結構體定義如下 type txdata structac...