Satatus.go

package main

import (
	"crypto/sha256"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

// ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ๋ฐ ๊ตฌ์กฐ์ฒด ์ •์˜
type Status struct{}

type SignedQuery struct {
	Query     map[string]interface{} `json:"query"`
	PublicKey string                 `json:"public_key"`
	Signature string                 `json:"signature"`
}

type Receipt struct {
	PreviousBlockhash string                 `json:"previous_blockhash"`
	Beneficiary       string                 `json:"beneficiary"`
	SignedQuery       map[string]interface{} `json:"signed_query"`
	PublicKey         string                 `json:"public_key"`
	Signature         string                 `json:"signature"`
}

// MainChain, Env, Bunch, Signer, Hasher ๊ตฌ์กฐ์ฒด ๋ฐ ๊ด€๋ จ ๋ฉ”์†Œ๋“œ ์ •์˜ ํ•„์š”
// ์ด ๋ถ€๋ถ„์€ ์‹ค์ œ ๊ตฌํ˜„์— ๋งž๊ฒŒ ์ˆ˜์ • ํ•„์š”

// Mocked functions and structs for demonstration purposes
var lastBlockHash = "mocked_last_block_hash"

type MainChain struct{}

func (mc *MainChain) LastBlock() *Block {
	return &Block{BlockHash: lastBlockHash}
}

func MainChainInstance() *MainChain {
	return &MainChain{}
}

type Block struct {
	BlockHash string
}

type Env struct{}

func (e *Env) Owner() string {
	return "mocked_owner"
}

func (e *Env) Peer() *Peer {
	return &Peer{PublicKey: "mocked_public_key", PrivateKey: "mocked_private_key"}
}

func EnvInstance() *Env {
	return &Env{}
}

type Peer struct {
	PublicKey  string
	PrivateKey string
}

type Bunch struct{}

func (b *Bunch) AddReceipt(receipt *Receipt) {
	// ์‹ค์ œ ์˜์ˆ˜์ฆ ์ถ”๊ฐ€ ๋กœ์ง ๊ตฌํ˜„
	fmt.Println("Receipt added:", receipt)
}

func BunchInstance() *Bunch {
	return &Bunch{}
}

type Signer struct{}

func (s *Signer) SignatureValidity(hash, publicKey, signature string) bool {
	// ์‹ค์ œ ์„œ๋ช… ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง ๊ตฌํ˜„
	return true
}

func (s *Signer) Signature(hash, privateKey string) string {
	// ์‹ค์ œ ์„œ๋ช… ์ƒ์„ฑ ๋กœ์ง ๊ตฌํ˜„
	return "mocked_signature"
}

func SignerInstance() *Signer {
	return &Signer{}
}

type Hasher struct{}

func (h *Hasher) Hash(data interface{}) string {
	jsonData, _ := json.Marshal(data)
	hash := sha256.Sum256(jsonData)
	return fmt.Sprintf("%x", hash)
}

func HasherInstance() *Hasher {
	return &Hasher{}
}

// main ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜
func (s *Status) Main(w http.ResponseWriter, req *http.Request) {
	signedQueryStr := req.FormValue("signed_query")
	if signedQueryStr == "" {
		signedQueryStr = "{}"
	}

	var signedQuery SignedQuery
	if err := json.Unmarshal([]byte(signedQueryStr), &signedQuery); err != nil {
		http.Error(w, "Invalid JSON format", http.StatusBadRequest)
		return
	}

	query := signedQuery.Query
	publicKey := signedQuery.PublicKey
	signature := signedQuery.Signature
	roundKey, _ := query["previous_blockhash"].(string)

	mainChain := MainChainInstance()
	if mainChain.LastBlock().BlockHash != roundKey || !SignerInstance().SignatureValidity(HasherInstance().Hash(query), publicKey, signature) {
		return
	}

	receiptHeader := map[string]interface{}{
		"previous_blockhash": roundKey,
		"beneficiary":        EnvInstance().Owner(),
		"signed_query":       signedQuery,
	}

	receipt := &Receipt{
		PreviousBlockhash: roundKey,
		Beneficiary:       EnvInstance().Owner(),
		SignedQuery:       signedQuery.Query,
		PublicKey:         EnvInstance().Peer().PublicKey,
		Signature:         SignerInstance().Signature(HasherInstance().Hash(receiptHeader), EnvInstance().Peer().PrivateKey),
	}

	BunchInstance().AddReceipt(receipt)

	// ์‘๋‹ต์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๋‹จ์ˆœํžˆ ๋ฐ˜ํ™˜
	return
}

func main() {
	http.HandleFunc("/status", func(w http.ResponseWriter, req *http.Request) {
		status := &Status{}
		status.Main(w, req)
	})

	http.ListenAndServe(":8080", nil)
}

์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ•จ์ˆ˜

ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ๋ฐ ๊ตฌ์กฐ์ฒด ์ •์˜

  1. ํŒจํ‚ค์ง€ ์ž„ํฌํŠธ:

    • crypto/sha256: SHA-256 ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • encoding/json: JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • fmt: ํฌ๋งท๋œ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • io/ioutil: ์ž…์ถœ๋ ฅ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • net/http: HTTP ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ตฌ์กฐ์ฒด ์ •์˜:

    • SignedQuery: ์„œ๋ช…๋œ ์ฟผ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค. Query, PublicKey, Signature ํ•„๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

    • Receipt: ์˜์ˆ˜์ฆ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค. PreviousBlockhash, Beneficiary, SignedQuery, PublicKey, Signature ํ•„๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๋ชจ์˜ ํ•จ์ˆ˜์™€ ๊ตฌ์กฐ์ฒด ์ •์˜

์ด ์˜ˆ์ œ์—์„œ๋Š” ์‹ค์ œ ๊ตฌํ˜„ ๋Œ€์‹  ๋ชจ์˜(mocked) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ์˜ ํ•จ์ˆ˜๋Š” ์‹ค์ œ ๋ธ”๋ก์ฒด์ธ ์‹œ์Šคํ…œ์—์„œ ๊ตฌํ˜„๋  ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Status ๊ตฌ์กฐ์ฒด์™€ Main ํ•จ์ˆ˜

์ด ๋ถ€๋ถ„์€ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋กœ์ง์ž…๋‹ˆ๋‹ค.

  • signedQueryStr: ์š”์ฒญ์—์„œ signed_query ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฐ’์ด ์—†์œผ๋ฉด ๋นˆ JSON ๊ฐ์ฒด๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • signedQuery: signedQueryStr๋ฅผ JSON์œผ๋กœ ํŒŒ์‹ฑํ•˜์—ฌ SignedQuery ๊ตฌ์กฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • query, publicKey, signature: signedQuery์—์„œ ๊ฐ๊ฐ ์ฟผ๋ฆฌ, ๊ณต๊ฐœ ํ‚ค, ์„œ๋ช… ๊ฐ’์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

  • roundKey: ์ฟผ๋ฆฌ์—์„œ previous_blockhash ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค.

  • mainChain: MainChainInstance๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฉ”์ธ ์ฒด์ธ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ:

    • ๋ฉ”์ธ ์ฒด์ธ์˜ ๋งˆ์ง€๋ง‰ ๋ธ”๋ก ํ•ด์‹œ๊ฐ€ roundKey์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • ์ฟผ๋ฆฌ์˜ ํ•ด์‹œ ๊ฐ’๊ณผ ์„œ๋ช…์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • receiptHeader: ์˜์ˆ˜์ฆ ํ—ค๋”๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • receipt: Receipt ๊ตฌ์กฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • BunchInstance: BunchInstance๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜ ๋ฌถ์Œ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์˜์ˆ˜์ฆ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

main ํ•จ์ˆ˜

์ด ํ•จ์ˆ˜๋Š” HTTP ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • /status ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ Status ๊ตฌ์กฐ์ฒด์˜ Main ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ํฌํŠธ 8080์—์„œ HTTP ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝ

์ด ์ฝ”๋“œ๋Š” HTTP ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•˜์—ฌ /status ๊ฒฝ๋กœ์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์—์„œ signed_query ๊ฐ’์„ ์ฝ๊ณ , ์„œ๋ช…๋œ ์ฟผ๋ฆฌ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•œ ํ›„, ์˜์ˆ˜์ฆ์„ ์ƒ์„ฑํ•˜์—ฌ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์ธ ์ฒ˜๋ฆฌ ํ›„์—๋Š” ์•„๋ฌด ์‘๋‹ต๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋Š” ํŠน์ • ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ „์ฒด์ ์œผ๋กœ ํ˜‘๋ ฅํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Last updated