func (inv *Inventory) VerifyTransaction(tx *messages.Transaction) (bool, error) { var inputValue, outputValue uint64 for index, input := range tx.Inputs { stack := script.Stack{} err := stack.Execute(input.Signature, nil) if err != nil { return false, fmt.Errorf("Failed to push signature: %v", err) } prev := input.PreviousOutput d, found := inv.txHashes[string(prev.Hash)] if !found { return false, fmt.Errorf("Input tx %x not found in map.", prev.Hash) } inputTx := d.tx output := inputTx.Outputs[prev.Index] inputValue += output.Value data := &script.Data{ Hasher: func(c uint32) []byte { return utils.DoubleHash(tx.SignSerialize( index, output.Script, c)) }} err = stack.Execute(output.Script, data) if err != nil { return false, fmt.Errorf("Failed to execute script: %v", err) } if !stack.CheckSuccess() { return false, fmt.Errorf("Signature on input %d not valid.", index) } } for _, output := range tx.Outputs { outputValue += output.Value } if outputValue > inputValue { return false, fmt.Errorf("Outputs have higher value (%d) than inputs (%d).", outputValue, inputValue) } return true, nil }