aboutsummaryrefslogblamecommitdiffstats
path: root/transaction.go
blob: 562593c966166ca741b8d8c19ff2cce285ebaf0b (plain) (tree)
1
2
3
4
5
6
7
8







                 













                                            






                                       







                                         
                    



                      
                    
 

                    


                    
                                                                          

                                                                             
                 











                                                 
                             





                                          
                                            

                                              
              
              


                 


            
                       










































                                                  
                                   








                                                 




                     
                                                       



                                                       
                                  

                                    
                                                         

                                



                                                               

                                  
                                  

                                    
                                    

                                       
                                   













                                                
package main

import (
  "math/big"
  "fmt"
  "encoding/hex"
  "crypto/sha256"
  _ "bytes"
)

/*
Transaction   Contract       Size
-------------------------------------------
sender        sender       20 bytes
recipient     0x0          20 bytes
value         endowment     4 bytes (uint32)
fee           fee           4 bytes (uint32)
d_size        o_size        4 bytes (uint32)
data          ops           *
signature     signature    64 bytes
*/

var StepFee     *big.Int = new(big.Int)
var TxFee       *big.Int = new(big.Int)
var ContractFee *big.Int = new(big.Int)
var MemFee      *big.Int = new(big.Int)
var DataFee     *big.Int = new(big.Int)
var CryptoFee   *big.Int = new(big.Int)
var ExtroFee    *big.Int = new(big.Int)

var Period1Reward *big.Int = new(big.Int)
var Period2Reward *big.Int = new(big.Int)
var Period3Reward *big.Int = new(big.Int)
var Period4Reward *big.Int = new(big.Int)

type Transaction struct {
  sender      string
  recipient   string
  value       uint32
  fee         uint32
  data        []string
  memory      []int
  lastTx      string

  // To be removed
  signature   string
  addr        string
}

func NewTransaction(to string, value uint32, data []string) *Transaction {
  tx := Transaction{sender: "1234567890", recipient: to, value: value}
  tx.fee = 0//uint32((ContractFee + MemoryFee * float32(len(tx.data))) * 1e8)
  tx.lastTx = "0"

  // Serialize the data
  tx.data = make([]string, len(data))
  for i, val := range data {
    instr, err := CompileInstr(val)
    if err != nil {
      fmt.Printf("compile error:%d %v", i+1, err)
    }

    tx.data[i] = instr
  }

  b:= []byte(tx.MarshalRlp())
  hash := sha256.Sum256(b)
  tx.addr = hex.EncodeToString(hash[0:19])

  return &tx
}

func (tx *Transaction) MarshalRlp() []byte {
  // Prepare the transaction for serialization
  preEnc := []interface{}{
    tx.lastTx,
    tx.sender,
    tx.recipient,
    tx.value,
    tx.fee,
    tx.data,
  }

  return Encode(preEnc)
}

func (tx *Transaction) UnmarshalRlp(data []byte) {
  t, _ := Decode(data,0)
  if slice, ok := t.([]interface{}); ok {
    if lastTx, ok := slice[0].([]byte); ok {
      tx.lastTx = string(lastTx)
    }

    if sender, ok := slice[1].([]byte); ok {
      tx.sender = string(sender)
    }

    if recipient, ok := slice[2].([]byte); ok {
      tx.recipient = string(recipient)
    }

    // If only I knew of a better way.
    if value, ok := slice[3].(uint8); ok {
      tx.value = uint32(value)
    }
    if value, ok := slice[3].(uint16); ok {
      tx.value = uint32(value)
    }
    if value, ok := slice[3].(uint32); ok {
      tx.value = uint32(value)
    }
    if value, ok := slice[3].(uint64); ok {
      tx.value = uint32(value)
    }
    if fee, ok := slice[4].(uint8); ok {
      tx.fee = uint32(fee)
    }
    if fee, ok := slice[4].(uint16); ok {
      tx.fee = uint32(fee)
    }
    if fee, ok := slice[4].(uint32); ok {
      tx.fee = uint32(fee)
    }
    if fee, ok := slice[4].(uint64); ok {
      tx.fee = uint32(fee)
    }

    // Encode the data/instructions
    if data, ok := slice[5].([]interface{}); ok {
      tx.data = make([]string, len(data))
      for i, d := range data {
        if instr, ok := d.([]byte); ok {
          tx.data[i] = string(instr)
        }
      }
    }
  }
}

func InitFees() {
  // Base for 2**60
  b60 := new(big.Int)
  b60.Exp(big.NewInt(2), big.NewInt(64), big.NewInt(0))
  // Base for 2**80
  b80 := new(big.Int)
  b80.Exp(big.NewInt(2), big.NewInt(80), big.NewInt(0))

  StepFee.Div(b60, big.NewInt(64))
  //fmt.Println("StepFee:", StepFee)

  TxFee.Exp(big.NewInt(2), big.NewInt(64), big.NewInt(0))
  //fmt.Println("TxFee:", TxFee)

  ContractFee.Exp(big.NewInt(2), big.NewInt(64), big.NewInt(0))
  //fmt.Println("ContractFee:", ContractFee)

  MemFee.Div(b60, big.NewInt(4))
  //fmt.Println("MemFee:", MemFee)

  DataFee.Div(b60, big.NewInt(16))
  //fmt.Println("DataFee:", DataFee)

  CryptoFee.Div(b60, big.NewInt(16))
  //fmt.Println("CrytoFee:", CryptoFee)

  ExtroFee.Div(b60, big.NewInt(16))
  //fmt.Println("ExtroFee:", ExtroFee)

  Period1Reward.Mul(b80, big.NewInt(1024))
  //fmt.Println("Period1Reward:", Period1Reward)

  Period2Reward.Mul(b80, big.NewInt(512))
  //fmt.Println("Period2Reward:", Period2Reward)

  Period3Reward.Mul(b80, big.NewInt(256))
  //fmt.Println("Period3Reward:", Period3Reward)

  Period4Reward.Mul(b80, big.NewInt(128))
  //fmt.Println("Period4Reward:", Period4Reward)
}