bitxhub/internal/executor/contracts/appchain_manager.go

117 lines
3.9 KiB
Go

package contracts
import (
"fmt"
"strconv"
appchainMgr "github.com/meshplus/bitxhub-core/appchain-mgr"
"github.com/meshplus/bitxhub-model/pb"
"github.com/meshplus/bitxhub/internal/constant"
"github.com/meshplus/bitxhub/pkg/vm/boltvm"
)
type AppchainManager struct {
boltvm.Stub
appchainMgr.AppchainManager
}
// Register appchain managers registers appchain info caller is the appchain
// manager address return appchain id and error
func (am *AppchainManager) Register(validators string, consensusType int32, chainType, name, desc, version, pubkey string) *boltvm.Response {
am.AppchainManager.Persister = am.Stub
res := am.CrossInvoke(constant.InterchainContractAddr.String(), "Register")
if !res.Ok {
return res
}
return responseWrapper(am.AppchainManager.Register(validators, consensusType, chainType, name, desc, version, pubkey))
}
// UpdateAppchain updates approved appchain
func (am *AppchainManager) UpdateAppchain(validators string, consensusType int32, chainType, name, desc, version, pubkey string) *boltvm.Response {
am.AppchainManager.Persister = am.Stub
return responseWrapper(am.AppchainManager.UpdateAppchain(validators, consensusType, chainType, name, desc, version, pubkey))
}
//FetchAuditRecords fetches audit records by appchain id
func (am *AppchainManager) FetchAuditRecords(id string) *boltvm.Response {
am.AppchainManager.Persister = am.Stub
return responseWrapper(am.AppchainManager.FetchAuditRecords(id))
}
// CountApprovedAppchains counts all approved appchains
func (am *AppchainManager) CountApprovedAppchains() *boltvm.Response {
am.AppchainManager.Persister = am.Stub
return responseWrapper(am.AppchainManager.CountApprovedAppchains())
}
// CountAppchains counts all appchains including approved, rejected or registered
func (am *AppchainManager) CountAppchains() *boltvm.Response {
am.AppchainManager.Persister = am.Stub
return responseWrapper(am.AppchainManager.CountAppchains())
}
// Appchains returns all appchains
func (am *AppchainManager) Appchains() *boltvm.Response {
am.AppchainManager.Persister = am.Stub
return responseWrapper(am.AppchainManager.Appchains())
}
// Appchain returns appchain info
func (am *AppchainManager) Appchain() *boltvm.Response {
am.AppchainManager.Persister = am.Stub
return responseWrapper(am.AppchainManager.Appchain())
}
func (am *AppchainManager) GetAppchain(id string) *boltvm.Response {
am.AppchainManager.Persister = am.Stub
return responseWrapper(am.AppchainManager.GetAppchain(id))
}
// GetPubKeyByChainID can get aim chain's public key using aim chain ID
func (am *AppchainManager) GetPubKeyByChainID(id string) *boltvm.Response {
am.AppchainManager.Persister = am.Stub
return responseWrapper(am.AppchainManager.GetPubKeyByChainID(id))
}
// Audit bitxhub manager audit appchain register info
func (am *AppchainManager) Audit(proposer string, isApproved int32, desc string) *boltvm.Response {
am.AppchainManager.Persister = am.Stub
if res := am.IsAdmin(); !res.Ok {
return res
}
return responseWrapper(am.AppchainManager.Audit(proposer, isApproved, desc))
}
func (am *AppchainManager) DeleteAppchain(cid string) *boltvm.Response {
am.AppchainManager.Persister = am.Stub
if res := am.IsAdmin(); !res.Ok {
return res
}
res := am.CrossInvoke(constant.InterchainContractAddr.String(), "DeleteInterchain", pb.String(cid))
if !res.Ok {
return res
}
return responseWrapper(am.AppchainManager.DeleteAppchain(cid))
}
func (am *AppchainManager) IsAdmin() *boltvm.Response {
ret := am.CrossInvoke(constant.RoleContractAddr.String(), "IsAdmin", pb.String(am.Caller()))
is, err := strconv.ParseBool(string(ret.Result))
if err != nil {
return boltvm.Error(fmt.Errorf("judge caller type: %w", err).Error())
}
if !is {
return boltvm.Error("caller is not an admin account")
}
return boltvm.Success([]byte("1"))
}
func responseWrapper(ok bool, data []byte) *boltvm.Response {
if ok {
return boltvm.Success(data)
}
return boltvm.Error(string(data))
}