FISCO-BCOS Web3SDK 1.3与2.0对比

2020-04-30  本文已影响0人  CodingCattwo

原创内容,未经允许不得转载

本文对源码的解读为个人理解,欢迎指正
关联github仓库:FISCO-BCOS/web3sdk

FISCO BCOS 1.3的sdk(proxy)

web3sdk 1.3

client (打断点执行一遍初始化过程)

Handler:除了channelConnections是发起连接时的,其余为连接后触发

proxy (2.0后移除,改为protocol协议+event事件通知)

dto

FISCO BCOS 2.0的web3sdk(channel)

底层配合也增加了libchannelserver 的模块,包含channelServer,sdk则作为channleClient

web3sdk 2.0

client

handler:处理连接时、连接后的handler

protocol 规定了channel连接到节点的协议

event.filter,新增的模块,事件通知 (AMOP?)

结合Contract的event触发event log,通过注册EventLogPushCallBack可获得回调

dto

Proxy和Protocol作用异同

一个是sdk启用一个proxy(Server),处理消息的上传下发(send/push)

一个是规定消息类型、消息内容等,建立了channel长连接,直接将节点的push在callback中处理

开发中获取callback

sdk只开放了出块blockNotifyCallBack给用户获取,其余的ChannelMessage的callback,或者BcosMessage的callback都拿不到

channel/handler/ConnectionCallBack.java

获取所有的消息通知,

@Override
public void onMessage(ChannelHandlerContext ctx, ByteBuf message) {
    try {
        Message msg = new Message();
        msg.readHeader(message);

        logger.trace(
                "onMessage, seq:{}, type: {}, result: {}",
                msg.getSeq(),
                msg.getType(),
                msg.getResult());

        if (msg.getType() == ChannelMessageType.AMOP_REQUEST.getType()
                || msg.getType() == ChannelMessageType.AMOP_RESPONSE.getType()
                || msg.getType() == ChannelMessageType.AMOP_MULBROADCAST.getType()) {
            ChannelMessage2 channelMessage = new ChannelMessage2(msg);
            channelMessage.readExtra(message);
            channelService.onReceiveChannelMessage2(ctx, channelMessage);
        } else if (msg.getType() == ChannelMessageType.CHANNEL_RPC_REQUEST.getType()) {
            BcosMessage fiscoMessage = new BcosMessage(msg);
            fiscoMessage.readExtra(message);
            channelService.onReceiveEthereumMessage(ctx, fiscoMessage);
        } else if (msg.getType() == ChannelMessageType.CLIENT_HEARTBEAT.getType()) {
            msg.readExtra(message);
            channelService.onReceiveHeartbeat(ctx, msg);
        } else if (msg.getType() == ChannelMessageType.CLIENT_HANDSHAKE.getType()) {
            BcosMessage fiscoMessage = new BcosMessage(msg);
            fiscoMessage.readExtra(message);
            channelService.onReceiveEthereumMessage(ctx, fiscoMessage);
        } else if (msg.getType() == ChannelMessageType.CLIENT_REGISTER_EVENT_LOG.getType()) {
            ChannelMessage2 channelMessage = new ChannelMessage2(msg);
            channelMessage.readExtra(message);
            channelService.onReceiveRegisterEventResponse(ctx, channelMessage);
        } else if (msg.getType() == ChannelMessageType.TRANSACTION_NOTIFY.getType()) {
            BcosMessage fiscoMessage = new BcosMessage(msg);
            fiscoMessage.readExtra(message);
            channelService.onReceiveTransactionMessage(ctx, fiscoMessage);
        } else if (msg.getType() == ChannelMessageType.BLOCK_NOTIFY.getType()) {
            // new block notify
            ChannelMessage2 channelMessage = new ChannelMessage2(msg);
            channelMessage.readExtra(message);
            channelService.onReceiveBlockNotify(ctx, channelMessage);
        } else if (msg.getType() == ChannelMessageType.EVENT_LOG_PUSH.getType()) {
            BcosMessage bcosMessage = new BcosMessage(msg);
            bcosMessage.readExtra(message);
            channelService.onReceiveEventLogPush(ctx, bcosMessage);
        } else if (msg.getType() == ChannelMessageType.REQUEST_TOPICCERT.getType()) {
            logger.info("get generate rand value request data");
            TopicVerifyMessage channelMessage = new TopicVerifyMessage(msg);
            channelMessage.readExtra(message);
            try {
                channelService.checkTopicVerify(ctx, channelMessage);
            } catch (IOException e) {
                logger.error("on receive channel failed");
            }
        } else {
            logger.error("unknown message type:{}", msg.getType());
        }
    } finally {
        message.release();
    }
}

上一篇 下一篇

猜你喜欢

热点阅读