filecoin lotus API 接口使用笔记golang
前言:post 对接 filecoin lotus接口
lotus
https://github.com/filecoin-project/lotus
lotus 基本文档
https://docs.lotu.sh/
两个Lotus节点+矿工API
https://github.com/filecoin-project/lotus/blob/master/api/api_common.go
Lotus节点API
https://github.com/filecoin-project/lotus/blob/master/api/api_full.go
Lotus Miner API
https://github.com/filecoin-project/lotus/blob/master/api/api_storage.go
步骤1:找到 .lotus/config.toml 修改配置
ListenAddress ip改成内网ip,这样就可以内网访问接口,如不修改,则只能本地127.0.0.1访问
RemoteListenAddress 要链接接口的的ip地址
# Default config:
[API]
ListenAddress = "/ip4/127.0.0.1/tcp/1234/http" //改这~ 127.0.0.1 改成内网ip,这样就可以内外访问接口,
RemoteListenAddress = "127.0.0.1" //改这~ 要链接接口的的ip地址
Timeout = "30s"
#
[Libp2p]
# ListenAddresses = ["/ip4/0.0.0.0/tcp/0", "/ip6/::/tcp/0"]
# AnnounceAddresses = []
# NoAnnounceAddresses = []
# ConnMgrLow = 150
# ConnMgrHigh = 180
# ConnMgrGrace = "20s"
#
[Pubsub]
# Bootstrapper = false
# RemoteTracer = "/ip4/xxx.xx.xx.xxx/tcp/4001/p2p/xxxxxxxxxxxxxxxxxx"
#
[Client]
# UseIpfs = false
# IpfsMAddr = ""
# IpfsUseForRetrieval = false
#
[Metrics]
# Nickname = ""
# HeadNotifs = false
步骤2:启动节点
nohup lotus daemon & --这里我用后台启动
接入接口
这里我模拟接入3个接口,ChainHead,ChainGetBlock,ChainGetBlockMessages
这在源码中 FullNode 可以找到
参数: jsonrpc 写死2.0
参数: method 请求的接口名字
参数: id 不知道
参数: params 每个接口对应需要的参数
func ChainHead()(jsonstr string,err error) {
song := make(map[string]interface{})
song["jsonrpc"] = "2.0"
song["method"] = "Filecoin.ChainHead"
song["id"] = 3
bytesData, err := json.Marshal(song)
if err != nil {
return "",err
}
reader := bytes.NewReader(bytesData)
request, err := http.NewRequest("POST", "http://127.0.0.1:1234/rpc/v0", reader)
if err != nil {
fmt.Println(err.Error())
return "",err
}
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
client := http.Client{}
resp, err := client.Do(request)
if err != nil {
fmt.Println(err.Error())
return "",err
}
respBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err.Error())
return "",err
}
//byte数组直接转成string,优化内存
str := (*string)(unsafe.Pointer(&respBytes))
return *str,nil
}
func ChainGetBlock(cid string)(jsonstr string,err error) {
json:=`
{ "jsonrpc": "2.0", "method":"Filecoin.ChainGetBlock", "params": [{"/":"`+cid+`"}], "id": 3 }
`
reader := bytes.NewReader([]byte(json))
request, err := http.NewRequest("POST", "http://127.0.0.1:1234/rpc/v0", reader)
if err != nil {
fmt.Println(err.Error())
return "",err
}
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
client := http.Client{}
resp, err := client.Do(request)
if err != nil {
fmt.Println(err.Error())
return "",err
}
respBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err.Error())
return "",err
}
//byte数组直接转成string,优化内存
str := (*string)(unsafe.Pointer(&respBytes))
return *str,nil
}
func ChainGetBlockMessages(cid string) (jsonstr string,err error){
json:=`
{ "jsonrpc": "2.0", "method":"Filecoin.ChainGetBlockMessages", "params": [{"/":"`+cid+`"}], "id": 3 }
`
reader := bytes.NewReader([]byte(json))
request, err := http.NewRequest("POST", "http://127.0.0.1:1234/rpc/v0", reader)
if err != nil {
fmt.Println(err.Error())
return "",err
}
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
client := http.Client{}
resp, err := client.Do(request)
if err != nil {
fmt.Println(err.Error())
return "",err
}
respBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err.Error())
return "",err
}
//byte数组直接转成string,优化内存
str := (*string)(unsafe.Pointer(&respBytes))
return *str,nil
}