Giter Site home page Giter Site logo

myxtype / filecoin-client Goto Github PK

View Code? Open in Web Editor NEW
58.0 4.0 37.0 1014 KB

Golang的轻量级filecoin客户端,支持离线签名,基本满足钱包交易所充值提现逻辑

License: Apache License 2.0

Go 100.00%
filecoin lotus client rpc ipfs offline-signature

filecoin-client's Introduction

filecoin-client

goproxy.cn

需要自行部署Lotus Node节点:https://lotu.sh/en+getting-started

此库仅添加部分方法,但已经满足钱包充值提现逻辑了,如果需要其他方法,请Fork后自行添加。

充值流程:获取头部高度,从本地高度遍历到头部高度,再根据高度获取区块CID,根据区块CID获取区块的所有消息,判断消息的类型是否0(0为发送Fil),和接收地址是否是本地的地址。

说明请查询client_test文件。

安装

go get github.com/myxtype/filecoin-client

使用

package main

import (
	"context"
	"github.com/filecoin-project/go-address"
	"github.com/myxtype/filecoin-client"
)

func main() {
	client := filecoin.NewClient("http://127.0.0.1:1234/rpc/v0", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0.cF__3r_0IR9KwZ2nLkqcBW8vuPePruZieJAVvTAoUA4")

	addr, _ := address.NewFromString("t1e3soclcq34tq7wmykp7xkkmpkzjnghumm3syyay")
	bal, err := client.WalletBalance(context.Background(), addr)
	if err != nil {
		panic(err)
	}

	println(bal.String())
}

离线签名版

公共节点申请:https://infura.io

具体实现逻辑在官方库中:https://github.com/filecoin-project/go-filecoin

package main

import (
	"context"
	"encoding/hex"
	"github.com/filecoin-project/go-address"
	"github.com/filecoin-project/go-state-types/abi"
	"github.com/myxtype/filecoin-client"
	"github.com/myxtype/filecoin-client/local"
	"github.com/myxtype/filecoin-client/types"
	"github.com/shopspring/decimal"
)

func main() {
	// 设置网络类型
	address.CurrentNetwork = address.Mainnet

	// 生产新的地址
	// 新地址有转入fil才激活,不然没法用
	ki, addr, err := local.WalletNew(types.KTSecp256k1)
	if err != nil {
		panic(err)
	}

	println(hex.EncodeToString(ki.PrivateKey))
	println(addr.String())

	// 50a5e6234f5fdfc026bd889347409e11b6ef5b6034a7b0572d7e24ed1e9ba0e4
	// f1dynqskhlixt5eswpff3a72ksprqmeompv3pbesy

	to, _ := address.NewFromString("f1yfi4yslez2hz3ori5grvv3xdo3xkibc4v6xjusy")

	// 转移0.001FIL到f1yfi4yslez2hz3ori5grvv3xdo3xkibc4v6xjusy
	msg := &types.Message{
		Version:    0,
		To:         to,
		From:       *addr,
		Nonce:      0,
		Value:      filecoin.FromFil(decimal.NewFromFloat(0.001)),
		GasLimit:   0,
		GasFeeCap:  abi.NewTokenAmount(10000),
		GasPremium: abi.NewTokenAmount(10000),
		Method:     0,
		Params:     nil,
	}

	client := filecoin.New("https://1lB5G4SmGdSTikOo7l6vYlsktdd:[email protected]")

	// 最大手续费0.0001 FIL
	//maxFee := filecoin.FromFil(decimal.NewFromFloat(0.0001))

	// 估算GasLimit
	//msg, err = client.GasEstimateMessageGas(context.Background(), msg, &types.MessageSendSpec{MaxFee: maxFee}, nil)
	//if err != nil {
	//	panic(err)
	//}

	// 离线签名
	s, err := local.WalletSignMessage(types.KTSecp256k1, ki.PrivateKey, msg)
	if err != nil {
		panic(err)
	}

	println(hex.EncodeToString(s.Signature.Data))
	// 47bcbb167fd9040bd02dba02789bc7bc0463c290db1be9b07065c12a64fb84dc546bef7aedfba789d0d7ce2c4532f8fa0d2dd998985ad3ec1a8b064c26e4625a01

	// 验证签名
	if err := local.WalletVerifyMessage(s); err != nil {
		panic(err)
	}

	mid, err := client.MpoolPush(context.Background(), s)
	if err != nil {
		panic(err)
	}

	println(mid.String())
}

暂时不支持bls类型,仅支持secp256k1,所以离线签名所有类型请选择types.KTSecp256k1

私钥存储在数据库请进行加密存储,建议进行AES加密,将AES密钥放在代码中,别放配置文件,编译到执行文件中。

Util

util.go 中提供FIL小数与大数之间的转换,但没有严格测试,请小心使用。

充值流程

参见:/examples/recharge

Lotus文档

https://lotu.sh/en+api-methods

filecoin-client's People

Contributors

myxtype avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

filecoin-client's Issues

离线签名解决方法

我是把签名的代码单独拿出来,"github.com/ipsn/go-secp256k1"换成了以太坊的"github.com/ethereum/go-ethereum/crypto/secp256k1"就可以了
`package util

import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"fmt"
"github.com/filecoin-project/go-address"
"github.com/ethereum/go-ethereum/crypto/secp256k1"
"github.com/minio/blake2b-simd"
)

const PrivateKeyBytes = 32

type secpSigner struct{}

func (secpSigner) GenPrivate() ([]byte, error) {
key, err := ecdsa.GenerateKey(secp256k1.S256(), rand.Reader)
if err != nil {
return nil, err
}
privkey := make([]byte, PrivateKeyBytes)
blob := key.D.Bytes()
copy(privkey[PrivateKeyBytes-len(blob):], blob)
return privkey, nil
}

func (secpSigner) ToPublic(pk []byte) ([]byte, error) {
x, y := secp256k1.S256().ScalarBaseMult(pk)
return elliptic.Marshal(secp256k1.S256(), x, y), nil
}

func (secpSigner) Sign(pk []byte, msg []byte) ([]byte, error) {
b2sum := blake2b.Sum256(msg)
sig, err := secp256k1.Sign(b2sum[:], pk)
if err != nil {
return nil, err
}
return sig, nil
}

func (secpSigner) Verify(sig []byte, a address.Address, msg []byte) error {
b2sum := blake2b.Sum256(msg)
pubk, err := secp256k1.RecoverPubkey(b2sum[:], sig)
if err != nil {
return err
}
maybeaddr, err := address.NewSecp256k1Address(pubk)
if err != nil {
return err
}
if a != maybeaddr {
return fmt.Errorf("signature did not match")
}
return nil
}`

交易时,关于params参数使用

msg := &types.Message{ Version: 0, To: to, From: from, Nonce: 0, Value: filecoin.FromFil(f.Amount), GasLimit: 0, GasFeeCap: abi.NewTokenAmount(0), GasPremium: abi.NewTokenAmount(0), Method: 0, Params: params, }

params 的值是[]byte类型,实例中都是传递nil,想请教一下,如果是一个结构体或map,应该如何传参在 https://filscan.io/中的参数中显示。

Cid 问题。

messageId := "bafy2bzacec6rz3qox7ggeataldk6nsmg5rtq2xusyqwqd24mdc5cao3lnsfos"
id, err := cid.Parse(messageId)
// id = bafy2bzacec6rz3qox7ggeataldk6nsmg5rtq2xusyqwqd24mdc5cao3lnsfos
// id = messageId

message, err := client.ChainGetMessage(context.Background(), id)
newId = message.Cid().String()
// newId = bafy2bzaceaaeakuwwgbistlzc5ih7ioxqu4q4qok4cvzozxuvzbp3wsxp3ios
// newId != messageId

你好,通过 client.ChainGetMessage() 方法获取message,message得到的Cid不一致。求解答。

windows 交叉编译解决方案

可以用 github.com/btcsuite/btcd/btcec 库里的签名方法替换。

原始代码

sig, err := sigs.Sign(crypto.SigTypeSecp256k1, p, mb.Cid().Bytes())

替换代码

hash := blake2b.Sum256(mb.Cid().Bytes())
pri, _ := btcec.PrivKeyFromBytes(btcec.S256(), p)
sig, _ := btcec.SignCompact(btcec.S256(), pri, hash[:], false)
v := sig[0] - 27
copy(sig, sig[1:])
sig[64] = v

finalSig := &crypto.Signature{
	Type: crypto.SigTypeSecp256k1,
	Data: sig,
}

之前做eth不能交叉编译,后来换了这个,没想到fil也能用上。

转账时,Nonce值的问题。

StateGetActor()方法放回的是账户当前的Nonce值,如果账户当前有N个Pending的交易,那这个Nonce值要赋值什么?


	actor, err := c.StateGetActor(context.Background(), msg.From, nil)
	if err != nil {
		t.Error(err)
	}

	msg.Nonce = actor.Nonce

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.