Commit ed03355a authored by vicotor's avatar vicotor

add payment

parent 7de21d1c
...@@ -4,7 +4,6 @@ import ( ...@@ -4,7 +4,6 @@ import (
rotatelogs "github.com/lestrrat-go/file-rotatelogs" rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/odysseus/nodemanager/config" "github.com/odysseus/nodemanager/config"
"github.com/odysseus/nodemanager/metrics" "github.com/odysseus/nodemanager/metrics"
"github.com/odysseus/nodemanager/model"
"github.com/odysseus/nodemanager/server" "github.com/odysseus/nodemanager/server"
"github.com/rifflock/lfshook" "github.com/rifflock/lfshook"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
...@@ -70,7 +69,6 @@ func initConfig() { ...@@ -70,7 +69,6 @@ func initConfig() {
} }
func runNode() { func runNode() {
model.DbInit()
n := server.NewNode() n := server.NewNode()
if err := n.Start(); err != nil { if err := n.Start(); err != nil {
log.WithError(err).Error("run node failed") log.WithError(err).Error("run node failed")
......
...@@ -6,11 +6,11 @@ require ( ...@@ -6,11 +6,11 @@ require (
github.com/BurntSushi/toml v1.3.2 github.com/BurntSushi/toml v1.3.2
github.com/astaxie/beego v1.12.3 github.com/astaxie/beego v1.12.3
github.com/ethereum/go-ethereum v1.13.10 github.com/ethereum/go-ethereum v1.13.10
github.com/go-sql-driver/mysql v1.5.0
github.com/golang/protobuf v1.5.3 github.com/golang/protobuf v1.5.3
github.com/hashicorp/golang-lru v0.5.4 github.com/hashicorp/golang-lru v0.5.4
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/odysseus/odysseus-protocol v0.0.0-00010101000000-000000000000 github.com/odysseus/odysseus-protocol v0.0.0-00010101000000-000000000000
github.com/odysseus/payment v0.0.0-00010101000000-000000000000
github.com/prometheus/client_golang v1.18.0 github.com/prometheus/client_golang v1.18.0
github.com/redis/go-redis/v9 v9.4.0 github.com/redis/go-redis/v9 v9.4.0
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
...@@ -29,6 +29,8 @@ require ( ...@@ -29,6 +29,8 @@ require (
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect
github.com/gomodule/redigo v2.0.0+incompatible // indirect
github.com/google/uuid v1.5.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect
github.com/holiman/uint256 v1.2.4 // indirect github.com/holiman/uint256 v1.2.4 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect
...@@ -63,3 +65,5 @@ require ( ...@@ -63,3 +65,5 @@ require (
) )
replace github.com/odysseus/odysseus-protocol => ../odysseus-protocol replace github.com/odysseus/odysseus-protocol => ../odysseus-protocol
replace github.com/odysseus/payment => ../payment
...@@ -56,7 +56,6 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 ...@@ -56,7 +56,6 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
...@@ -76,6 +75,7 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg ...@@ -76,6 +75,7 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
...@@ -83,6 +83,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ ...@@ -83,6 +83,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
...@@ -113,11 +115,9 @@ github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkL ...@@ -113,11 +115,9 @@ github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkL
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA= github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ= github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ=
github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw= github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw=
github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
......
package model
func DbInit() {
//if config.GetConfig().EnablePay == false {
// return
//}
//// Set up database
//dbconf := config.GetConfig().DbConfig
//datasource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", dbconf.User, dbconf.Passwd, dbconf.Host, dbconf.Port, dbconf.DbName)
//orm.RegisterDriver("mysql", orm.DRMySQL)
//err := orm.RegisterDataBase("default", "mysql", datasource)
//if err != nil {
// log.WithError(err).Fatal("failed to connect to database")
//}
//orm.RegisterModel(new(User))
}
package model
import (
_ "github.com/go-sql-driver/mysql"
)
type User struct {
ID int64 `orm:"column(id)" db:"id" json:"id" form:"id"` // 用户id
Name string `orm:"column(name)" db:"name" json:"name" form:"name"` // 开发者名称
Phone string `orm:"column(phone)" db:"phone" json:"phone" form:"phone"` // 电话
Mail string `orm:"column(mail)" db:"mail" json:"mail" form:"mail"` // 邮箱
ChainAccount string `orm:"column(chain_account)" db:"chain_account" json:"chain_account" form:"chain_account"` // 区块链账号
Type int64 `orm:"column(type)" db:"type" json:"type" form:"type"`
IsAuthed int64 `orm:"column(is_authed)" db:"is_authed" json:"is_authed" form:"is_authed"` // 是否实名
RegisterFrom int64 `orm:"column(register_from)" db:"register_from" json:"register_from" form:"register_from"` // 注册来源,三方账号
RegisterFromDesc string `orm:"column(register_from_desc)" db:"register_from_desc" json:"register_from_desc" form:"register_from_desc"` // 三方账户描述
Username string `orm:"column(username)" db:"username" json:"username" form:"username"` // 开发者平台用户名
Balance int64 `orm:"column(balance)" db:"balance" json:"balance" form:"balance"` // 用户账户余额
Level int64 `orm:"column(level)" db:"level" json:"level" form:"level"` // 信用等级,决定免费调用额度
CustomId string `orm:"column(custom_id)" db:"custom_id" json:"custom_id" form:"custom_id"` // 自定义kong的id
CreatedTime int64 `orm:"column(created_time)" db:"created_time" json:"created_time" form:"created_time"` // 创建时间
UpdatedTime int64 `orm:"column(updated_time)" db:"updated_time" json:"updated_time" form:"updated_time"` // 更新时间
Deleted int64 `orm:"column(deleted)" db:"deleted" json:"deleted" form:"deleted"` // 逻辑删除
}
func (User) TableName() string {
return "user"
}
//
//type UserRepository interface {
// Create(user *User) error
// GetByUserId(uid int64) (*User, error)
// Update(user *User) error
// Delete(user *User) error
//}
//
//type UserRepositoryImpl struct {
// o orm.Ormer
//}
//
//func NewUserRepository() UserRepository {
// o := orm.NewOrm()
// return &UserRepositoryImpl{o}
//}
//
//func (repo *UserRepositoryImpl) Create(user *User) error {
// _, err := repo.o.Insert(user)
// return err
//}
//
//func (repo *UserRepositoryImpl) GetByUserId(uid int64) (*User, error) {
// user := User{ID: uid}
// err := repo.o.Read(&user)
// if err != nil {
// return nil, err
// }
// return &user, nil
//}
//
//func (repo *UserRepositoryImpl) Update(user *User) error {
// _, err := repo.o.Update(user)
// return err
//}
//
//func (repo *UserRepositoryImpl) Delete(user *User) error {
// _, err := repo.o.Delete(user)
// return err
//}
...@@ -7,6 +7,7 @@ import ( ...@@ -7,6 +7,7 @@ import (
"github.com/odysseus/nodemanager/nmregistry" "github.com/odysseus/nodemanager/nmregistry"
"github.com/odysseus/nodemanager/utils" "github.com/odysseus/nodemanager/utils"
omanager "github.com/odysseus/odysseus-protocol/gen/proto/go/nodemanager/v1" omanager "github.com/odysseus/odysseus-protocol/gen/proto/go/nodemanager/v1"
"github.com/odysseus/payment"
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"google.golang.org/grpc" "google.golang.org/grpc"
...@@ -19,6 +20,7 @@ type Node struct { ...@@ -19,6 +20,7 @@ type Node struct {
rdb *redis.Client rdb *redis.Client
wm *WorkerManager wm *WorkerManager
privk *ecdsa.PrivateKey privk *ecdsa.PrivateKey
payment *payment.Payment
} }
func NewNode() *Node { func NewNode() *Node {
...@@ -28,6 +30,11 @@ func NewNode() *Node { ...@@ -28,6 +30,11 @@ func NewNode() *Node {
Password: redisConfig.Password, Password: redisConfig.Password,
DbIndex: redisConfig.DbIndex, DbIndex: redisConfig.DbIndex,
}) })
pay := payment.NewPayment(payment.RedisConnParam{
Addr: redisConfig.Addr,
Password: redisConfig.Password,
DbIndex: redisConfig.DbIndex,
})
privk, err := utils.HexToPrivatekey(config.GetConfig().PrivateKey) privk, err := utils.HexToPrivatekey(config.GetConfig().PrivateKey)
if err != nil { if err != nil {
log.WithError(err).Error("failed to parse node manager private key") log.WithError(err).Error("failed to parse node manager private key")
...@@ -36,6 +43,7 @@ func NewNode() *Node { ...@@ -36,6 +43,7 @@ func NewNode() *Node {
node := &Node{ node := &Node{
rdb: rdb, rdb: rdb,
privk: privk, privk: privk,
payment: pay,
apiServer: grpc.NewServer(grpc.MaxSendMsgSize(1024*1024*20), grpc.MaxRecvMsgSize(1024*1024*20)), apiServer: grpc.NewServer(grpc.MaxSendMsgSize(1024*1024*20), grpc.MaxRecvMsgSize(1024*1024*20)),
registry: nmregistry.NewRegistryService(config.GetConfig(), rdb, privk.PublicKey), registry: nmregistry.NewRegistryService(config.GetConfig(), rdb, privk.PublicKey),
} }
......
package server package server
import ( import (
"context"
"errors" "errors"
"fmt" "fmt"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
...@@ -13,6 +14,7 @@ import ( ...@@ -13,6 +14,7 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"golang.org/x/crypto/sha3" "golang.org/x/crypto/sha3"
"math/big" "math/big"
"strconv"
"sync" "sync"
"time" "time"
) )
...@@ -306,8 +308,9 @@ func (wm *WorkerManager) manageWorker(worker *Worker) error { ...@@ -306,8 +308,9 @@ func (wm *WorkerManager) manageWorker(worker *Worker) error {
log.WithField("taskid", task.TaskId).Debug("post task result") log.WithField("taskid", task.TaskId).Debug("post task result")
} }
}() }()
wm.Payment(task)
_ = wm.AddWorker(worker) _ = wm.AddWorker(worker)
wm.Payment(task)
// todo: post event for task succeed or failed // todo: post event for task succeed or failed
return true return true
} }
...@@ -399,41 +402,11 @@ func (wm *WorkerManager) handleWorkerMsg(worker *Worker) { ...@@ -399,41 +402,11 @@ func (wm *WorkerManager) handleWorkerMsg(worker *Worker) {
func (wm *WorkerManager) Payment(task *odysseus.TaskContent) error { func (wm *WorkerManager) Payment(task *odysseus.TaskContent) error {
if config.GetConfig().EnablePay == true { if config.GetConfig().EnablePay == true {
// pay for task. // pay for task.
//uid, err := strconv.ParseInt(task.TaskUid, 10, 64) fee, _ := strconv.ParseInt(task.TaskFee, 10, 64)
//if err != nil { _, err := wm.node.payment.DecrBalance(context.Background(), task.TaskUid, fee)
// log.WithFields(log.Fields{ if err != nil {
// "taskid": task.TaskId, return err
// "uid": task.TaskUid, }
// "error": err,
// }).Error("parse task uid failed")
//}
//user, err := wm.userRepo.GetByUserId(uid)
//if err != nil {
// log.WithFields(log.Fields{
// "taskid": task.TaskId,
// "uid": task.TaskUid,
// "error": err,
// }).Error("get user by uid failed")
//}
//if user != nil {
// fee, _ := strconv.ParseInt(task.TaskFee, 10, 64)
// user.Balance = user.Balance - fee
// err = wm.userRepo.Update(user)
// if err != nil {
// log.WithFields(log.Fields{
// "taskid": task.TaskId,
// "uid": task.TaskUid,
// "error": err,
// }).Error("update user failed")
// } else {
// log.WithFields(log.Fields{
// "taskid": task.TaskId,
// "uid": task.TaskUid,
// "fee": fee,
// }).Info("pay task fee finished")
// }
//}
} }
return nil return nil
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment