使用Corda Explorer RPC连接节点时出现Kryo Buffer Underflow异常
点击登录后立即出现如下异常:
(ClientConsumerImpl.java:1122) core.client.run - AMQ214000: Failed to call onMessage com.esotericsoftware.kryo.KryoException: Buffer underflow. Serialization trace: owningKey (net.corda.core.identity.Party) value (net.corda.core.utilities.Try$Success) at com.esotericsoftware.kryo.io.Input.require(Input.java:199) ~[kryo-4.0.0.jar:?] at com.esotericsoftware.kryo.io.Input...
嘿,这个Kryo序列化的Buffer Underflow异常我之前碰过好几次,核心原因基本都是序列化格式不兼容或者配置出错,给你几个实操的解决方向:
先检查Corda节点和Explorer的版本一致性
Kryo是Corda用来序列化对象的核心库,不同Corda版本的Kryo序列化规则会有细微差异。如果你的节点运行的是Corda 4.9,那Explorer必须也是4.9版本的包,小版本号都不能差。别图省事混用不同版本,这是最常见的触发原因。验证节点的RPC配置是否正确
打开节点的node.conf文件,核对这几个关键配置:rpcSettings.address和rpcSettings.adminAddress的端口要和你在Explorer登录时输入的地址完全匹配,比如节点配置的是localhost:10006,Explorer就不能填localhost:10007rpcUsers里的用户名、密码、权限要正确,尤其是权限至少要包含RPC或者直接给ALL权限,不然Explorer无法获取节点数据
给个正确的配置片段参考:
rpcSettings { address="localhost:10006" adminAddress="localhost:10046" } rpcUsers=[ { username=explorerUser password=securePassword123 permissions=["ALL"] } ]清理Explorer的本地缓存再重启
有时候Explorer本地缓存的旧序列化元数据会和当前节点的格式冲突,步骤很简单:- 彻底关闭Corda Explorer
- 找到缓存目录:Windows是
C:\Users\<你的用户名>\.corda\explorer,Linux/macOS是~/.corda/explorer - 删除这个目录下的所有文件
- 重新启动Explorer再尝试登录
检查自定义CorDapp的序列化白名单
如果你的节点部署了自己开发的CorDapp,要确保自定义的业务类(比如合约状态、Flow类)都加入了节点的序列化白名单。Kryo无法序列化不在白名单里的类,也会触发这个异常。在node.conf里配置:serializationWhitelist { whitelist = ["com.yourcompany.cordapp.contracts.YourContractState", "com.yourcompany.cordapp.flows.YourFlow"] }配置完记得重启节点。
内容的提问来源于stack exchange,提问作者Toadfather

