Factory.go

package rpc

import (
	"time"

	"saseul/model"
	"util/signer"
)

// Factory๋Š” ํŠธ๋žœ์žญ์…˜๊ณผ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค.
type Factory struct{}

// Transaction ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ํƒ€์ž…๊ณผ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
func (f *Factory) Transaction(txType string, vars map[string]interface{}, privateKey *string) *model.SignedTransaction {
	if privateKey == nil {
		key := signer.GeneratePrivateKey()
		privateKey = &key
	}

	transaction := f.Data(txType, *privateKey, nil)

	for key, value := range vars {
		transaction[key] = value
	}

	signedTx := &model.SignedTransaction{
		Transaction: transaction,
		PublicKey:   signer.PublicKey(*privateKey),
	}

	signedTx.Signature = signer.Signature(signedTx.Hash(), *privateKey)

	return signedTx
}

// Request ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ํƒ€์ž…๊ณผ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…๋œ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
func (f *Factory) Request(reqType string, vars map[string]interface{}, privateKey *string) *model.SignedRequest {
	if privateKey == nil {
		key := signer.GeneratePrivateKey()
		privateKey = &key
	}

	request := f.Data(reqType, *privateKey, nil)

	for key, value := range vars {
		request[key] = value
	}

	signedReq := &model.SignedRequest{
		Request:   request,
		PublicKey: signer.PublicKey(*privateKey),
	}

	signedReq.Signature = signer.Signature(signedReq.Hash(), *privateKey)

	return signedReq
}

// Data ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ํƒ€์ž…๊ณผ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
func (f *Factory) Data(dataType string, privateKey string, cid *string) map[string]interface{} {
	data := map[string]interface{}{
		"type":      dataType,
		"timestamp": time.Now().UnixNano(),
		"from":      signer.Address(signer.PublicKey(privateKey)),
	}

	if cid != nil {
		data["cid"] = *cid
	}

	return data
}

// CTransaction ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ CID์™€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
func (f *Factory) CTransaction(cid, txType string, vars map[string]interface{}, privateKey *string) *model.SignedTransaction {
	if privateKey == nil {
		key := signer.GeneratePrivateKey()
		privateKey = &key
	}

	transaction := f.Data(txType, *privateKey, &cid)

	for key, value := range vars {
		transaction[key] = value
	}

	signedTx := &model.SignedTransaction{
		Transaction: transaction,
		PublicKey:   signer.PublicKey(*privateKey),
	}

	signedTx.Signature = signer.Signature(signedTx.Hash(), *privateKey)

	return signedTx
}

// CRequest ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ CID์™€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…๋œ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
func (f *Factory) CRequest(cid, reqType string, vars map[string]interface{}, privateKey *string) *model.SignedRequest {
	if privateKey == nil {
		key := signer.GeneratePrivateKey()
		privateKey = &key
	}

	request := f.Data(reqType, *privateKey, &cid)

	for key, value := range vars {
		request[key] = value
	}

	signedReq := &model.SignedRequest{
		Request:   request,
		PublicKey: signer.PublicKey(*privateKey),
	}

	signedReq.Signature = signer.Signature(signedReq.Hash(), *privateKey)

	return signedReq
}

์ด ์ฝ”๋“œ๋Š” Factory๋ผ๋Š” ๊ตฌ์กฐ์ฒด์™€ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ, ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜๊ณผ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ํ•˜๋‚˜ํ•˜๋‚˜ ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

Factory ๊ตฌ์กฐ์ฒด

Factory ๊ตฌ์กฐ์ฒด๋Š” ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜๊ณผ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Transaction ํ•จ์ˆ˜

์ด ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ํŠธ๋žœ์žญ์…˜ ํƒ€์ž…๊ณผ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. privateKey๊ฐ€ nil์ด๋ฉด ์ƒˆ๋กœ์šด ๊ฐœ์ธ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. Data ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  3. ์ฃผ์–ด์ง„ ๋ณ€์ˆ˜๋“ค์„ ํŠธ๋žœ์žญ์…˜์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. model.SignedTransaction ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ณต๊ฐœ ํ‚ค์™€ ์„œ๋ช…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Request ํ•จ์ˆ˜

์ด ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ์š”์ฒญ ํƒ€์ž…๊ณผ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์„œ๋ช…๋œ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. privateKey๊ฐ€ nil์ด๋ฉด ์ƒˆ๋กœ์šด ๊ฐœ์ธ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. Data ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  3. ์ฃผ์–ด์ง„ ๋ณ€์ˆ˜๋“ค์„ ์š”์ฒญ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. model.SignedRequest ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ณต๊ฐœ ํ‚ค์™€ ์„œ๋ช…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ์„œ๋ช…๋œ ์š”์ฒญ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Data ํ•จ์ˆ˜

์ด ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๊ฐœ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๊ฐœ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. ํ˜„์žฌ ์‹œ๊ฐ„์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ฐœ์ธ ํ‚ค๋กœ๋ถ€ํ„ฐ ์ฃผ์†Œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ from ํ•„๋“œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. cid๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ cid ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  5. ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

CTransaction ํ•จ์ˆ˜

์ด ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ CID, ํŠธ๋žœ์žญ์…˜ ํƒ€์ž…, ๋ณ€์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. privateKey๊ฐ€ nil์ด๋ฉด ์ƒˆ๋กœ์šด ๊ฐœ์ธ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. Data ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ CID๋ฅผ ํฌํ•จํ•œ ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  3. ์ฃผ์–ด์ง„ ๋ณ€์ˆ˜๋“ค์„ ํŠธ๋žœ์žญ์…˜์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. model.SignedTransaction ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ณต๊ฐœ ํ‚ค์™€ ์„œ๋ช…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

CRequest ํ•จ์ˆ˜

์ด ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ CID, ์š”์ฒญ ํƒ€์ž…, ๋ณ€์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์„œ๋ช…๋œ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. privateKey๊ฐ€ nil์ด๋ฉด ์ƒˆ๋กœ์šด ๊ฐœ์ธ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. Data ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ CID๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  3. ์ฃผ์–ด์ง„ ๋ณ€์ˆ˜๋“ค์„ ์š”์ฒญ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. model.SignedRequest ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ณต๊ฐœ ํ‚ค์™€ ์„œ๋ช…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ์„œ๋ช…๋œ ์š”์ฒญ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ์„œ๋ช…๋œ ํŠธ๋žœ์žญ์…˜๊ณผ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐ ๋ฉ”์„œ๋“œ๋Š” ๊ฐœ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ช…ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๊ฐœ์ธ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Last updated