Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Methods without @Property got invoked during serialization #233

Open
gqqnbig opened this issue Mar 8, 2022 · 0 comments
Open

Methods without @Property got invoked during serialization #233

gqqnbig opened this issue Mar 8, 2022 · 0 comments

Comments

@gqqnbig
Copy link
Contributor

gqqnbig commented Mar 8, 2022

I'm looking at version 2.3 but I think the behavior holds for the lastest version.

The following code is based on https://github.com/hyperledger/fabric-samples/tree/main/asset-transfer-basic/chaincode-java.

@DataType
public class Sale {
	public String getName() {
		System.out.println("getName");
		return getName();
	}
}

@Contract
public final class AssetTransfer implements ContractInterface {

    @Transaction(intent = Transaction.TYPE.EVALUATE)
    public Sale getSale(final Context ctx) {
        return new Sale();
    }
}

I deliberately wrote a recursion but it should be a factor because this method is not marked with @Property.

After I call peer chaincode query -C mychannel -n basic -c '{"Args":["getSale"]}', I then check the docker logs by running (zsh)

docker logs $(docker ps -n 1 --filter 'name=dev-peer0.org1' --format '{{.ID}}') |& vim -

I see a huge number of output "getName", which indicates getName() is called although it's not marked with @Property.

In this example code, there is nothing going wrong. But if the method returns an object that requires another serialization or has cyclic reference, this unexpected call is very likely to cause uncatched StackOverflowError or other errors.

This log is from my real project. You can see I eventually get

thread[fabric-txinvoke:3,5,main] 05:37:40:138 severe  org.hyperledger.fabric.logger error                                              nulljava.lang.stackoverflowerror

infinite-call.log

I feel I should use the magic word "@JSONPropertyIgnore" on getName().

This secret word didn't appear on https://hyperledger-fabric.readthedocs.io/en/latest/search.html?q=JSONPropertyIgnore&check_keywords=yes nor this repo.

Should we add @JSONPropertyIgnore somewhere?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant