ITPub博客

首页 > 数据库 > NewSQL > 浅谈“量化合约系统开发”方案“合约量化系统开发”技术原理

浅谈“量化合约系统开发”方案“合约量化系统开发”技术原理

原创 NewSQL 作者:Tg_StPv888 时间:2023-04-10 14:09:35 0 删除 编辑

1. Client 处理过程

internal/peer/channel/create.go

func executeCreate(cf *ChannelCmdFactory) error {

// 发送创建通道的交易

err := sendCreateChainTransaction(cf)

if err != nil {

return err

}

// 获取通道的创世区块

block, err := getGenesisBlock(cf)

if err != nil {

return err

}

b, err := proto.Marshal(block)

if err != nil {

return err

}

file := channelID + ".block"

if outputBlock != common.UndefinedParamValue {

file = outputBlock

}

// 保存通道创世区块信息

err = ioutil.WriteFile(file, b, 0o644)

if err != nil {

return err

}

return nil

}

1.1. 发送创建通道的交易

internal/peer/channel/create.go

func sendCreateChainTransaction(cf *ChannelCmdFactory) error {

var err error

var chCrtEnv *cb.Envelope

// 如果传入创建通道的交易信息,则读取并解析

if channelTxFile != "" {

if chCrtEnv, err = createChannelFromConfigTx(channelTxFile); err != nil {

return err

}

} else { // 如果没有传入,则根据默认的配置yaml进行创建

if chCrtEnv, err = createChannelFromDefaults(cf); err != nil {

return err

}

}

// 对交易信息进行必要检查,通过后对消息进行签名

if chCrtEnv, err = sanityCheckAndSignConfigTx(chCrtEnv, cf.Signer); err != nil {

return err

}

var broadcastClient common.BroadcastClient

broadcastClient, err = cf.BroadcastFactory()

if err != nil {

return errors.WithMessage(err, "error getting broadcast client")

}

defer broadcastClient.Close()

// 发送封装好的消息

err = broadcastClient.Send(chCrtEnv)

return err

1.2. 获取通道的创世区块

每隔 200 毫秒尝试从排序节点获取一次通道的创世区块,即区块号为 0 的区块。

internal/peer/channel/create.go

func getGenesisBlock(cf *ChannelCmdFactory) (*cb.Block, error) {

timer := time.NewTimer(timeout)

defer timer.Stop()

for {

select {

case <-timer.C:

cf.DeliverClient.Close()

return nil, errors.New("timeout waiting for channel creation")

default:

// 获取创世区块

if block, err := cf.DeliverClient.GetSpecifiedBlock(0); err != nil {

cf.DeliverClient.Close()

cf, err = InitCmdFactory(EndorserNotRequired, PeerDeliverNotRequired, OrdererRequired)

if err != nil {

return nil, errors.WithMessage(err, "failed connecting")

}

// 休眠 200 毫秒

time.Sleep(200 * time.Millisecond)

} else {

cf.DeliverClient.Close()

return block, nil

2. Orderer 处理过程

orderer/common/broadcast/broadcast.go

// Handle reads requests from a Broadcast stream, processes them, and returns the responses to the stream

func (bh *Handler) Handle(srv ab.AtomicBroadcast_BroadcastServer) error {

addr := util.ExtractRemoteAddress(srv.Context())

logger.Debugf("Starting new broadcast loop for %s", addr)

for {

// 接收消息

msg, err := srv.Recv()

if err == io.EOF {

logger.Debugf("Received EOF from %s, hangup", addr)

return nil

}

if err != nil {

logger.Warningf("Error reading from %s: %s", addr, err)

return err

}

// 处理消息

resp := bh.ProcessMessage(msg, addr)

// 发送处理结果

err = srv.Send(resp)

if resp.Status != cb.Status_SUCCESS {

return err

}

if err != nil {

logger.Warningf("Error sending to %s: %s", addr, err)

return err

}

}

}


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70016646/viewspace-2944709/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
专业区块项目开发团队:18028578624微電

注册时间:2022-04-13

  • 博文量
    158
  • 访问量
    95679