If we look at the ChaincodeStub class in $/hyperledger/fabric-chaincode-node/libraries/fabric-shim/lib/stub.js we can see following code
async getState(key) {
logger.debug('getState called with key:%s', key);
// Access public data by setting the collection to empty string
const collection = '';
return await this.handler.handleGetState(collection, key, this.channel_id, this.txId);
}
async putState(key, value) {
// Access public data by setting the collection to empty string
const collection = '';
if (typeof value === 'string') {
value = Buffer.from(value);
}
return await this.handler.handlePutState(collection, key, value, this.channel_id, this.txId);
}
The code for the handler (which is of type ChaincodeSupportClient) can be found in $/hyperledger/fabric-chaincode-node/libraries/fabric-shim/lib/handler.js
async handleGetState(collection, key, channel_id, txId) {
const msg = {
type: fabprotos.protos.ChaincodeMessage.Type.GET_STATE,
payload: fabprotos.protos.GetState.encode({key, collection}).finish(),
txid: txId,
channel_id: channel_id
};
logger.debug('handleGetState - with key:', key);
return await this._askPeerAndListen(msg, 'GetState');
}
async handlePutState(collection, key, value, channel_id, txId) {
const msg = {
type: fabprotos.protos.ChaincodeMessage.Type.PUT_STATE,
payload: fabprotos.protos.PutState.encode({key, value, collection}).finish(),
txid: txId,
channel_id: channel_id
};
return await this._askPeerAndListen(msg, 'PutState');
}
and it looks like this handler is instantiated in $/hyperledger/fabric-chaincode-node/libraries/fabric-shim/lib/chaincode.js
static start(chaincode) {
...
const client = new Handler(chaincode, url, optsCpy);
which in turn gets called when the chaincode is registered in $/hyperledger/fabric-chaincode-node/libraries/fabric-shim/lib/contract-spi/bootstrap.js
static register(contracts, serializers, fileMetadata, title, version) {
// load up the meta data that the user may have specified
// this will need to passed in and rationalized with the
// code as implemented
const chaincode = new ChaincodeFromContract(contracts, serializers, fileMetadata, title, version);
// say hello to the peer
shim.start(chaincode);
}