Fabric测试网络调用Java链码遇“Undefined contract called”错误求助
从你遇到的Error: endorsement failure during invoke. response: status:500 message:"Undefined contract called"错误来看,这通常是调用时指定的合约名称和Java链码中实际注册的合约不匹配导致的,下面是具体的排查和解决步骤:
1. 检查Java链码的合约注册逻辑
Java链码中,你需要在主链码类(继承ChaincodeBase的类)里明确注册你的合约实例。比如如果你的合约类是CarContract,要确保在链码的初始化方法或者构造函数里添加注册代码:
public class CarChaincode extends ChaincodeBase { public CarChaincode() { // 注册合约实例,默认合约名称为类的简单名称(比如CarContract) addContract(new CarContract()); // 若需自定义合约名称,可给合约类添加注解: // @Contract(name = "car") // public class CarContract implements Contract { ... } } // 其他必要的链码方法... }
如果没有注册合约,或者注册的实例不正确,就会触发找不到合约的错误。
2. 确认调用命令中的函数格式
调用Java链码时,函数名必须遵循合约名称:函数名的格式,而非直接写函数名。举两个例子:
- 如果合约类是
CarContract(未自定义名称),正确的调用命令应该是:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"CarContract:addNewCar","Args":["CAR123","Toyota","Camry","Red","Santosh"]}'
- 如果合约用
@Contract(name = "car")自定义了名称,函数名要写成car:addNewCar。
很多人会犯的错误是直接写"function":"addNewCar",这会让Fabric找不到对应的合约——Java链码的函数是归属到具体合约的,和Go链码直接暴露函数的逻辑不同。
3. 验证链码提交状态
虽然你提到已完成commit操作,但可以再确认链码的版本和名称是否与调用时一致:
peer lifecycle chaincode querycommitted -C mychannel
确保输出的链码名称、版本和你调用时使用的完全匹配,且已成功提交到目标通道。
4. 检查合约类的函数定义
确认你的CarContract类里确实存在addNewCar函数,且签名和注解符合要求:
@Transaction(intent = Transaction.TYPE.SUBMIT) public String addNewCar(Context ctx, String carId, String make, String model, String color, String owner) { // 函数业务逻辑... }
注意函数参数要和调用时传入的Args数量、类型匹配,同时提交类的函数要标记TYPE.SUBMIT,查询类函数标记TYPE.EVALUATE。
按照上面的步骤排查后,应该就能解决这个"Undefined contract called"的问题了。
内容的提问来源于stack exchange,提问作者Santosh Kumar

