Adapter-Klassen für interne-Repräsentation einer Blockchain

Hallo zusammen,
ich habe wiedermal eine Frage bezüglich des Vorgehens meines Buches zum Thema Blockchain-Entwicklung das ich gegenwärtig durcharbeite. Mittlerweile bin ich aber soweit durch damit und bin aktuell noch dabei die letzten offenen Fragen zu klären.
Und zwar geht es um folgendes: Ich habe bereits eine mehr oder weniger funktionierende Blockchain aufgesetzt und diese auch mit einer WebApi verbunden. Allerdings wurden einige Attribute z.B in der Klasse Transaction mit „@JsonIgnore“ ausgeblendet, da diese nicht bei der Konvertierung in JSON Repräsentation beachtet werden sollen. Laut Buch sind das beispielsweise Attribute wie „sizeInBytes“ und „blockId“ da diese "ausschließlich vom Miner gesetzt werden und nicht vom Nutzer.
Soweit mal ok…
In Kapitel 6 geht es nun darum ein p2p Netzwerk aufzubauen und quasi Transaktionen und Blöcke intern zwischen den einzelnen Knoten senden und empfangen zu können (verwendet wird dazu JGroups).
Zu Beginn heißt es man müsse sog. Adapter-Klassen erstellen welche für die interne Übertragung innerhalb des JGroups Channel verwendet werden (Also eine Klasse TransactionAdapter, BlockAdapter, BlockHeaderAdapter usw.) um auch wirklich alle Attribute einer Klasse übermitteln zu können, nämlich auch die, welche zuvor bei der WebApi über @JSON Ignore ausgeblendet wurden.
Nun kommt aber mein Verständnisproblem: Bei der Klasse Transaction(Adapter) und Block(Adapter) ist es soweit ersichtlich wieso das gemacht wird. Nur in der Klasse BlockHeader gibt es keinerlei Attribute welche ausgeblendet werden, deshalb ist es mir nicht ersichtlich wieso ich hierfür eine solche AdapterKlasse brauche. Das Buch behauptet allerdings felsenfest das doch welche ausgeblendet werden:
Bild 1: IMG-20220925-125411-edit-12167838236163 — ImgBB
Bild 2: IMG-20220925-125312-edit-12181525124702 — ImgBB

Hier nochmal die allgemeine Erklärung zu den Adapter-Klassen:
Bild 3: IMG-20220925-125233 — ImgBB

Und hier der Vergleich der beiden Klassen:
BlockAdapter:

public class BlockHeader implements Serializable {
	//Variablen
	private int version;
	private int nonce = 0;
	private long timestamp;
	private byte[] previousHash;
	private byte[] transactionListHash;
	
	//Konstruktor
	public BlockHeader() {
		
	}
	
	public BlockHeader(long timestamp, byte[] previousHash, byte[] transactionListHash) {
		this.version = 1;
		this.timestamp = timestamp;
		this.previousHash = previousHash;
		this.transactionListHash = transactionListHash;
	}
	
	//Methoden
	public void incrementNonce() throws ArithmeticException{
		if(this.nonce == Integer.MAX_VALUE) {
			throw new ArithmeticException("Nonce too high");
		}
		this.nonce ++;
	}
	
	@JsonConverter(HashConverter.class)
	public byte[] asHash() {
		return SHA3Helper.hash256(this);
	}

	//Getter und Setter
	public int getVersion() {
		return version;
	}

	public void setVersion(int version) {
		this.version = version;
	}

	public int getNonce() {
		return nonce;
	}

	public void setNonce(int nonce) {
		this.nonce = nonce;
	}

	public long getTimestamp() {
		return timestamp;
	}

	public void setTimestamp(long timestamp) {
		this.timestamp = timestamp;
	}

	@JsonConverter(HashConverter.class)
	public byte[] getPreviousHash() {
		return previousHash;
	}

	@JsonConverter(HashConverter.class)
	public void setPreviousHash(byte[] previousHash) {
		this.previousHash = previousHash;
	}

	@JsonConverter(HashConverter.class)
	public byte[] getTransactionListHash() {
		return transactionListHash;
	}

	@JsonConverter(HashConverter.class)
	public void setTransactionListHash(byte[] transactionListHash) {
		this.transactionListHash = transactionListHash;
	}
	
	
}

Und hier die Adapter-Klasse:

public class BlockHeaderAdapter {
	//Variablen
	private BlockHeader blockHeader;
	
	//Konstruktoren
	public BlockHeaderAdapter() {
		this.blockHeader = new BlockHeader();
	}
	
	public BlockHeaderAdapter(BlockHeader blockHeader) {
		this.blockHeader = blockHeader;
	}

	//Methoden
	public String getType() {
		return "BlockHeader";
	}
	
	@JsonIgnore
	public BlockHeader getBlockHeader() {
		return blockHeader;
	}
	
	//Getter und Setter
	public int getVersion() {
		return this.blockHeader.getVersion();
	}
	
	public void setVersion(int version) {
		this.blockHeader.setVersion(version);
	}
	
	public int getNonce() {
		return this.blockHeader.getNonce();
	}
	
	public void setNonce(int nonce) {
		this.blockHeader.setNonce(nonce);
	}
	
	public long getTimestamp() {
		return this.blockHeader.getTimestamp();
	}
	
	public void setTimestamp(long timestamp) {
		this.blockHeader.setTimestamp(timestamp);
	}
	
	@JsonConverter(HashConverter.class)
	public byte[] getPreviousHash() {
		return this.blockHeader.getPreviousHash();
	}
	
	@JsonConverter(HashConverter.class)
	public void setPreviousHash(byte[] previousHash) {
		this.blockHeader.setPreviousHash(previousHash);
	}
	
	@JsonConverter(HashConverter.class)
	public byte[] getTransactionListHash() {
		return this.blockHeader.getTransactionListHash();
	}
	
	@JsonConverter(HashConverter.class)
	public void setTransactionListHash(byte[] tLh) {
		this.blockHeader.setTransactionListHash(tLh);
	}
}

Kommt von eich jemand drauf was genau damit gemeint ist bzw. wieso dieser Adapter dann gebraucht wird?

PS: So sieht das Ausblenden mit JSON Ignore in der Transaction-Klasse aus:
Transaction

Update: Habe Kontakt mit dem Autor aufgenommen und auch einen Tag später schon die Antwort erhalten. Ein Adapter wäre hier technisch gesehen nicht nötig gewesen, er wurde aber dennoch implementiert um konsistent zu bleiben.

1 „Gefällt mir“