Nebulas 101 - 05 Interação com Nebulas através do API RPC¶
A chain de nós Nebulas pode ser acedida e controlada remotamente através de RPC. A chain de Nebulas fornece uma série de APIs para obter informação dos nós, balanço de contas, envio de transações, e implementação de chamadas de smart contracts.
O acesso remoto à chain de Nebulas é implementado por gRPC, e pode também ser acedido através de HTTP por um proxy (grpc-gateway). Acesso HTTP é uma interface implementada por RESTful, com os mesmos parâmetros de uma interface gRPC.
API¶
Implentamos um servidor RPC e HTTP para fornecer um serviço API em Go-Nebulas.
Módulos¶
Todas as interfaces estão divididas em dois módulos: API e Admin.
- API: Fornece interfaces que não têm relação com a chave privada do utilizador.
- Admin: Fornece interfaces que estão relacionadas com a chave privada do utilizador.
É recomendado para todos os nós de Nebulas que abram o módulo API para utilizadores públicos, e o módulo Admin para utilizadores autorizados. Nó: (O API Admin na testnet & mainnet da Nebulas não suporta chamadas remotas)
Configuração¶
Servidor RPC e HTTP pode ser configurado no ficheiro de configuração de cada nó de Nebulas.
rpc {
# Porta do serviço API gRPC
rpc_listen: ["127.0.0.1:8684"]
# Porta do serviço API HTTP
http_listen: ["127.0.0.1:8685"]
# Módulo aberto que fornece serviço http para fora
http_module: ["api", "admin"]
}
Exemplo¶
HTTP¶
Aqui estão alguns exemplos para invocar as interfaces HTTP usando curl
.
GetNebState¶
Pode invocar GetNebState
através do módulo API para obter o estado corrente do nó local de Nebulas, incluíndo a identidade da chain, bloco da cauda (tail block), versões do protocolo, entre outros.
> curl -i -H Accept:application/json -X GET http://localhost:8685/v1/user/nebstate
{"result":{"chain_id":100,"tail":"0aa1cceb7801b110fdd5217ba0a4356780c940133924d1c1a4eb60336934dab1","lib":"0000000000000000000000000000000000000000000000000000000000000000","height":"479","protocol_version":"/neb/1.0.0","synchronized":false,"version":"0.7.0"}}
UnlockAccount¶
Pode invocar UnlockAccount
através do módulo Admin para desbloquear uma conta na me memória. Todas as contas desbloqueadas podem ser utilizadas para enviar transações directamente sem senhas.
> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/admin/account/unlock -d '{"address":"n1NrMKTYESZRCwPFDLFKiKREzZKaN1nhQvz", "passphrase": "passphrase"}'
{"result":{"result":true}}
RPC¶
Servidor RPC foi implementado com GRPC. A serialização do GPRC é baseada em Protocol Buffers. Pode encontrar todos os ficheiros RPC protobuf no Directório Nebulas RPC Protobuf.
Aqui estão alguns exemplos da invocação de interfaces RPC usando golang
.
GetNebState¶
Podemos invocar GetNebState
através do módulo API para obter o estado corrente do nó local de Nebulas.
import(
"github.com/nebulasio/go-nebulas/rpc"
"github.com/nebulasio/go-nebulas/rpc/pb"
)
// Configuração do endereço de ligação ao servidor GRPC
addr := fmt.Sprintf("127.0.0.1:%d",uint32(8684))
conn, err := grpc.Dial(addr, grpc.WithInsecure())
if err != nil {
log.Warn("rpc.Dial() failed:", err)
}
defer conn.Close()
// Interface API para aceder a informação do estado do nó
api := rpcpb.NewAPIServiceClient(conn)
resp, err := ac.GetNebState(context.Background(), & rpcpb.GetNebStateRequest {})
if err != nil {
log.Println("GetNebState", "failed", err)
} else {
log.Println("GetNebState tail", resp)
}
LockAccount¶
Conta n1NrMKTYESZRCwPFDLFKiKREzZKaN1nhQvz
foi desbloqueada após invocar v1/admin/account/unlock
através do pedido HTTP acima. Pode invocar LockAccount
através do módulo Admin para a voltar a bloquear.
import(
"github.com/nebulasio/go-nebulas/rpc"
"github.com/nebulasio/go-nebulas/rpc/pb"
)
// Configuração do endereço de ligação ao servidor GRPC
addr := fmt.Sprintf("127.0.0.1:%d",uint32(8684))
conn, err := grpc.Dial(addr, grpc.WithInsecure())
if err != nil {
log.Warn("rpc.Dial() failed:", err)
}
defer conn.Close()
// Interface Admin para aceder, bloquear endereço de conta
admin := rpcpb.NewAdminServiceClient(conn)
from := "n1NrMKTYESZRCwPFDLFKiKREzZKaN1nhQvz"
resp, err = management.LockAccount(context.Background(), & rpcpb.LockAccountRequest {Address: from})
if err != nil {
log.Println("LockAccount", from, "failed", err)
} else {
log.Println("LockAccount", from, "result", resp)
}
Próximo¶
Bom trabalho! Vamos juntar-nos à Testnet ou Mainnet oficial para desfrutar de Nebulas agora!