public abstract void parse(NulsByteBuffer byteBuffer) throws NulsException;
public static Transaction getInstance(NulsByteBuffer byteBuffer) throws Exception { int txType = byteBuffer.readUint16(); byteBuffer.setCursor(byteBuffer.getCursor() - SerializeUtils.sizeOfUint16()); Class<? extends Transaction> txClass = TYPE_TX_MAP.get(txType); if (null == txClass) { throw new NulsRuntimeException(KernelErrorCode.DATA_NOT_FOUND); } Transaction tx = byteBuffer.readNulsData(txClass.newInstance()); return tx; }
@Override public void parse(NulsByteBuffer byteBuffer) throws NulsException { // 从流中读取签名,兼容新老版本 int course = 0; boolean isScript = false; List<P2PHKSignature> p2PHKSignatures = new ArrayList<>(); List<Script> scripts = new ArrayList<>(); while (!byteBuffer.isFinished()) { course = byteBuffer.getCursor(); //读取两个字节(脚本标识位),如果两个字节都为0x00则表示后面的数据流为脚本数据 if (!isScript && byteBuffer.getPayload().length < 2) { break; } if (isScript || Arrays.equals(NulsConstant.SIGN_HOLDER, byteBuffer.readBytes(2))) { isScript = true; if (!byteBuffer.isFinished()) { scripts.add(new Script(byteBuffer.readByLengthByte())); } } else { byteBuffer.setCursor(course); p2PHKSignatures.add(byteBuffer.readNulsData(new P2PHKSignature())); } } this.p2PHKSignatures = p2PHKSignatures; this.scripts = scripts; }
private List<BaseMessage> analysisMessage(ByteBuf buffer) throws NulsException { List<BaseMessage> messageList; try { messageList = new ArrayList<>(); byte[] bytes = new byte[buffer.readableBytes()]; buffer.readBytes(bytes); NulsByteBuffer byteBuffer = new NulsByteBuffer(bytes); while (!byteBuffer.isFinished()) { MessageHeader header = byteBuffer.readNulsData(new MessageHeader()); byteBuffer.setCursor(byteBuffer.getCursor() - header.size()); BaseMessage message = getMessageBusService().getMessageInstance(header.getModuleId(), header.getMsgType()).getData(); message = byteBuffer.readNulsData(message); messageList.add(message); } } catch (Exception e) { throw new NulsException(KernelErrorCode.DATA_ERROR, e); } finally { buffer.clear(); } return messageList; }