使用Kubo v0.20.0调用IpfsNode.Bootstrap触发空指针解引用求助
Kubo v0.20.0调用IpfsNode.Bootstrap触发空指针panic问题
使用Kubo v0.20.0时,调用IpfsNode.Bootstrap方法出现invalid memory address或nil pointer dereference错误,推测bootstrapRound过程中触发了panic,想确认是代码问题还是Kubo的Bug。
复现代码
package main import ( "context" "fmt" "github.com/ipfs/kubo/config" "github.com/ipfs/kubo/core" "github.com/ipfs/kubo/core/bootstrap" ) func main() { ctx := context.Background() conf := core.BuildCfg{} node, err := core.NewNode(ctx, &conf) if err != nil { panic(err) } peers, err := config.DefaultBootstrapPeers() if err != nil { panic(err) } bs_conf := bootstrap.BootstrapConfigWithPeers(peers) err = node.Bootstrap(bs_conf) // 触发空指针引用错误 fmt.Println("THIS LINE WILL NOT PRINT") if err != nil { panic(err) } }
完整错误信息
panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x40 pc=0xee49eb] goroutine 69 [running]: github.com/ipfs/kubo/core/bootstrap.bootstrapRound({0x18bf1d8?, 0xc0000b05f0?}, {0x0, 0x0}, {0x0?, 0x0?, 0x0?, 0xc0006240c0?}) /home/axel/go/pkg/mod/github.com/ipfs/kubo@v0.20.0/core/bootstrap/bootstrap.go:118 +0xab github.com/ipfs/kubo/core/bootstrap.Bootstrap.func1({0x18cbd58?, 0xc0006226c0?}) /home/axel/go/pkg/mod/github.com/ipfs/kubo@v0.20.0/core/bootstrap/bootstrap.go:89 +0xdc github.com/jbenet/goprocess.(*process).Go.func1() /home/axel/go/pkg/mod/github.com/jbenet/goprocess@v0.1.4/impl-mutex.go:134 +0x36 created by github.com/jbenet/goprocess.(*process).Go /home/axel/go/pkg/mod/github.com/jbenet/goprocess@v0.1.4/impl-mutex.go:133 +0x238 exit status 2
问题原因及修复
这是代码配置问题,不是Kubo的Bug。
默认初始化的core.BuildCfg是离线模式,不会启动P2P网络相关的核心组件(比如Host、Peerstore),而Bootstrap操作需要依赖这些组件来连接对等节点,导致bootstrapRound函数中访问了未初始化的nil对象,触发空指针panic。
修复方法:将BuildCfg的Online字段设为true,让节点以在线模式启动,自动初始化必要的网络组件:
func main() { ctx := context.Background() // 启用在线模式,初始化网络相关组件 conf := core.BuildCfg{Online: true} node, err := core.NewNode(ctx, &conf) if err != nil { panic(err) } peers, err := config.DefaultBootstrapPeers() if err != nil { panic(err) } bs_conf := bootstrap.BootstrapConfigWithPeers(peers) err = node.Bootstrap(bs_conf) fmt.Println("现在可以正常执行到这里") if err != nil { panic(err) } }
内容的提问来源于stack exchange,提问作者AxelG
相关产品推荐
相关产品推荐

