github.com/bigzoro/my_simplechain@v0.0.0-20240315012955-8ad0a2a29bb9/permission/api.go (about)

     1  package permission
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"math/big"
     7  
     8  	"github.com/bigzoro/my_simplechain/accounts/abi/bind"
     9  	"github.com/bigzoro/my_simplechain/common"
    10  	"github.com/bigzoro/my_simplechain/log"
    11  )
    12  
    13  var (
    14  	permissionKey = []byte("0x2022040600000000000000000000000000000002020021001")
    15  	storeAbiKey   = []byte("0x2022040600000000000000000000000000000002020021002")
    16  )
    17  
    18  type QuorumControlsAPI struct {
    19  	permissionService *Service
    20  }
    21  
    22  // AddPeer 添加节点
    23  func (q *QuorumControlsAPI) AddPeer(url string, from common.Address) (bool, error) {
    24  	return q.permissionService.AddPeer(url, from)
    25  }
    26  
    27  // RemovePeer 移除节点
    28  func (q *QuorumControlsAPI) RemovePeer(url string) (bool, error) {
    29  	return q.permissionService.RemovePeer(url)
    30  }
    31  
    32  // SetAdminNode 设置给定的节点成为管理节点
    33  // 在联盟网络初始化完成之前进行
    34  func (q *QuorumControlsAPI) SetAdminNode(fullNodeId, nodeName string, address common.Address, from common.Address) (string, error) {
    35  	return q.permissionService.SetAdminNode(fullNodeId, nodeName, address, from)
    36  }
    37  
    38  // InitFinish 完成联盟网络初始化
    39  func (q *QuorumControlsAPI) InitFinish(from common.Address) (string, error) {
    40  	return q.permissionService.InitFinish(from)
    41  }
    42  
    43  // MakeProposalForJoin 发起加入联盟提案
    44  func (q *QuorumControlsAPI) MakeProposalForJoin(fullNodeId string, nodeName string, nodeAddress common.Address, from common.Address) (string, error) {
    45  	return q.permissionService.MakeProposalForJoin(fullNodeId, nodeName, nodeAddress, from)
    46  }
    47  
    48  // AcceptProposalForJoin 接受加入联盟提案
    49  func (q *QuorumControlsAPI) AcceptProposalForJoin(fullNodeId string, from common.Address) (string, error) {
    50  	return q.permissionService.AcceptProposalForJoin(fullNodeId, from)
    51  }
    52  
    53  // RejectProposalForJoin 拒绝加入联盟提案
    54  func (q *QuorumControlsAPI) RejectProposalForJoin(fullNodeId string, from common.Address) (string, error) {
    55  	// 0 加入联盟
    56  	opCode := 0
    57  	return q.permissionService.Disagree(fullNodeId, opCode, from)
    58  }
    59  
    60  // MakeProposalForAdmin 发起成为管理节点提案
    61  func (q *QuorumControlsAPI) MakeProposalForAdmin(fullNodeId string, from common.Address) (string, error) {
    62  	return q.permissionService.MakeProposalForAdmin(fullNodeId, from)
    63  }
    64  
    65  // AcceptProposalForAdmin 接受成为管理节点提案
    66  func (q *QuorumControlsAPI) AcceptProposalForAdmin(fullNodeId string, from common.Address) (string, error) {
    67  	return q.permissionService.AcceptProposalForAdmin(fullNodeId, from)
    68  }
    69  
    70  // RejectProposalForAdmin 拒绝成为管理节点提案
    71  func (q *QuorumControlsAPI) RejectProposalForAdmin(fullNodeId string, from common.Address) (string, error) {
    72  	//2 升级为管理节点
    73  	opCode := 2
    74  	return q.permissionService.Disagree(fullNodeId, opCode, from)
    75  }
    76  
    77  // MakeProposalForCommon 发起成为普通节点提案
    78  func (q *QuorumControlsAPI) MakeProposalForCommon(fullNodeId string, from common.Address) (string, error) {
    79  	return q.permissionService.MakeProposalForCommon(fullNodeId, from)
    80  }
    81  
    82  // AcceptProposalForCommon 接受成为普通节点提案
    83  func (q *QuorumControlsAPI) AcceptProposalForCommon(fullNodeId string, from common.Address) (string, error) {
    84  	return q.permissionService.AcceptProposalForCommon(fullNodeId, from)
    85  }
    86  
    87  // RejectProposalForCommon 拒绝成为普通节点提案
    88  func (q *QuorumControlsAPI) RejectProposalForCommon(fullNodeId string, from common.Address) (string, error) {
    89  	// 3 降级成普通节点
    90  	opCode := 3
    91  	return q.permissionService.Disagree(fullNodeId, opCode, from)
    92  }
    93  
    94  // MakeProposalForExit 发起节点退出联盟提案
    95  func (q *QuorumControlsAPI) MakeProposalForExit(fullNodeId string, from common.Address) (string, error) {
    96  	return q.permissionService.MakeProposalForExit(fullNodeId, from)
    97  }
    98  
    99  // AcceptProposalForExit 接受节点退出联盟提案
   100  func (q *QuorumControlsAPI) AcceptProposalForExit(fullNodeId string, from common.Address) (string, error) {
   101  	return q.permissionService.AcceptProposalForExit(fullNodeId, from)
   102  }
   103  
   104  // RejectProposalForExit 拒绝节点退出联盟提案
   105  func (q *QuorumControlsAPI) RejectProposalForExit(fullNodeId string, from common.Address) (string, error) {
   106  	// 1 退出联盟
   107  	opCode := 1
   108  	return q.permissionService.Disagree(fullNodeId, opCode, from)
   109  }
   110  
   111  // IsNetworkInitFinished 联盟初始化网络是否完成
   112  func (q *QuorumControlsAPI) IsNetworkInitFinished() (bool, error) {
   113  	return q.permissionService.isInitFinished(), nil
   114  }
   115  
   116  // UpdateNodeInfo 节点自己更新ip和端口
   117  func (q *QuorumControlsAPI) UpdateNodeInfo(from common.Address, ip string, port string) (string, error) {
   118  	return q.permissionService.UpdateNodeInfo(from, ip, port)
   119  }
   120  
   121  // Exit 自己直接退出网络
   122  func (q *QuorumControlsAPI) Exit(from common.Address) (string, error) {
   123  	return q.permissionService.Exit(from)
   124  }
   125  
   126  // GetNodeByRole 根据角色获取节点
   127  // check pass
   128  func (q *QuorumControlsAPI) GetNodeByRole(role *big.Int, from common.Address) (string, error) {
   129  	return q.permissionService.GetNodeByRole(role, from)
   130  }
   131  
   132  // GetNodeRole 获取节点的角色
   133  func (q *QuorumControlsAPI) GetNodeRole(fullNodeId string, from common.Address) (*big.Int, error) {
   134  	return q.permissionService.GetNodeRole(fullNodeId, from)
   135  }
   136  
   137  // GetNodeInfoByName 根据节点名称获取节点信息
   138  func (q *QuorumControlsAPI) GetNodeInfoByName(nodeName string, from common.Address) (string, error) {
   139  	return q.permissionService.GetNodeInfoByName(nodeName, from)
   140  }
   141  
   142  // GetStateMap 获取节点申请的统计信息
   143  func (q *QuorumControlsAPI) GetStateMap(fullNodeId string, opCode string, from common.Address) (string, error) {
   144  	return q.permissionService.GetStateMap(fullNodeId, opCode, from)
   145  }
   146  
   147  // GetNodeInfo 获取节点信息
   148  // check pass
   149  func (q *QuorumControlsAPI) GetNodeInfo(fullNodeId string, from common.Address) (string, error) {
   150  	return q.permissionService.GetNodeInfo(fullNodeId, from)
   151  }
   152  
   153  // GetAllStatingRecord 获取正在进行的统计记录
   154  func (q *QuorumControlsAPI) GetAllStatingRecord(from common.Address) (string, error) {
   155  	return q.permissionService.GetAllStatingRecord(from)
   156  }
   157  
   158  // IsAdmin 是否是管理节点
   159  // check pass
   160  func (q *QuorumControlsAPI) IsAdmin(fullNodeId string, from common.Address) (bool, error) {
   161  	return q.permissionService.IsAdmin(fullNodeId, from)
   162  }
   163  
   164  // SetPermissionContractAddress 设置权限合约地址
   165  // check pass
   166  func (q *QuorumControlsAPI) SetPermissionContractAddress(addr common.Address) (bool, error) {
   167  	return q.permissionService.SetContractAddress(addr)
   168  }
   169  
   170  // GetPermissionContractAddress 获取权限合约地址
   171  // check pass
   172  func (q *QuorumControlsAPI) GetPermissionContractAddress() (string, error) {
   173  	var permission string
   174  	//read from leveldb
   175  	addr, err := loadContractAddress(permissionKey, q.permissionService.GetCommonDb())
   176  	if err != nil {
   177  		log.Warn("permission service warning, can not get permission address from db.", "err", err, "if addr is nil", addr == (common.Address{}))
   178  		return permission, err
   179  	}
   180  	if addr == (common.Address{}) {
   181  		return permission, nil
   182  	}
   183  	permission = addr.String()
   184  	return permission, nil
   185  }
   186  
   187  // SetStoreContractAddress 设置存储合约的地址
   188  // check pass
   189  func (q *QuorumControlsAPI) SetStoreContractAddress(addr common.Address) (bool, error) {
   190  	q.permissionService.storeAbiAddr = addr
   191  	storeAbiContract, err := NewStoreAbi(addr, q.permissionService.ethClient)
   192  	if err != nil {
   193  		return false, err
   194  	}
   195  	q.permissionService.storeAbiContract = storeAbiContract
   196  	//store address to db
   197  	err = storeContractAddress(storeAbiKey, addr, q.permissionService.GetCommonDb())
   198  	if err != nil {
   199  		return false, err
   200  	}
   201  	return true, nil
   202  }
   203  
   204  // GetStoreContractAddress 获取存储abi合约地址
   205  // check pass
   206  func (q *QuorumControlsAPI) GetStoreContractAddress() (string, error) {
   207  	var storeAbi string
   208  	addr, err := loadContractAddress(storeAbiKey, q.permissionService.GetCommonDb())
   209  	if err != nil {
   210  		log.Warn("permission service warning, can not get storeAbi address from db.", "err", err, "if addr is nil", addr == (common.Address{}))
   211  		return storeAbi, err
   212  	}
   213  	if addr == (common.Address{}) {
   214  		return storeAbi, errors.New("please set store contract address first")
   215  	}
   216  	storeAbi = addr.String()
   217  	return storeAbi, nil
   218  }
   219  
   220  // StoreContractAbi 保存合约的abi
   221  func (q *QuorumControlsAPI) StoreContractAbi(contractAddress common.Address, contractName string, abi string, from common.Address) (string, error) {
   222  	result := ""
   223  	if q.permissionService.storeAbiContract == nil {
   224  		addr, err := loadContractAddress(storeAbiKey, q.permissionService.GetCommonDb())
   225  		if err != nil {
   226  			return result, err
   227  		}
   228  		if addr == (common.Address{}) {
   229  			return result, errors.New("please set store contract address")
   230  		}
   231  		storeAbiContract, err := NewStoreAbi(addr, q.permissionService.ethClient)
   232  		if err != nil {
   233  			return result, err
   234  		}
   235  		q.permissionService.storeAbiContract = storeAbiContract
   236  	}
   237  	auth, err := q.permissionService.getAuth(from)
   238  	if err != nil {
   239  		return result, err
   240  	}
   241  	tx, err := q.permissionService.storeAbiContract.Set(auth, contractName, contractAddress, abi)
   242  	if err != nil {
   243  		return result, err
   244  	}
   245  	result = tx.Hash().String()
   246  	return result, nil
   247  }
   248  
   249  // GetContractAbi 根据合约名称获取合约的abi
   250  func (q *QuorumControlsAPI) GetContractAbi(contractName string, from common.Address) (string, error) {
   251  	result := ""
   252  	if q.permissionService.storeAbiContract == nil {
   253  		addr, err := loadContractAddress(storeAbiKey, q.permissionService.GetCommonDb())
   254  		storeAbiContract, err := NewStoreAbi(addr, q.permissionService.ethClient)
   255  		if err != nil {
   256  			return result, err
   257  		}
   258  		q.permissionService.storeAbiContract = storeAbiContract
   259  	}
   260  	opts := &bind.CallOpts{From: from}
   261  	addr, abi, err := q.permissionService.storeAbiContract.GetAbi(opts, contractName)
   262  	if err != nil {
   263  		return result, err
   264  	}
   265  	return fmt.Sprintf("%v@%v", addr.String(), abi), nil
   266  }
   267  
   268  func (q *QuorumControlsAPI) UpdateNodeName(fullNodeId string, nodeName string, from common.Address) (string, error) {
   269  	return q.permissionService.UpdateNodeName(fullNodeId, nodeName, from)
   270  }
   271  
   272  func (q *QuorumControlsAPI) GetAdminCount() (*big.Int, error) {
   273  	return q.permissionService.GetAdminCount()
   274  }
   275  
   276  // NodeExists 节点是否存在
   277  func (q *QuorumControlsAPI) NodeExists(fullNodeId string) (bool, error) {
   278  	return q.permissionService.nodeExists(fullNodeId), nil
   279  }