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 }