* contracts/ens: revert bmt to keccak256 * contracts/ens: fix keccak256 hash code comment
		
			
				
	
	
		
			159 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2016 The go-ethereum Authors
 | 
						|
// This file is part of the go-ethereum library.
 | 
						|
//
 | 
						|
// The go-ethereum library is free software: you can redistribute it and/or modify
 | 
						|
// it under the terms of the GNU Lesser General Public License as published by
 | 
						|
// the Free Software Foundation, either version 3 of the License, or
 | 
						|
// (at your option) any later version.
 | 
						|
//
 | 
						|
// The go-ethereum library is distributed in the hope that it will be useful,
 | 
						|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | 
						|
// GNU Lesser General Public License for more details.
 | 
						|
//
 | 
						|
// You should have received a copy of the GNU Lesser General Public License
 | 
						|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
 | 
						|
 | 
						|
package ens
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"encoding/binary"
 | 
						|
	"encoding/hex"
 | 
						|
	"fmt"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/ethereum/go-ethereum/common"
 | 
						|
)
 | 
						|
 | 
						|
// Tests for the decoding of the example ENS
 | 
						|
func TestEIPSpecCidDecode(t *testing.T) {
 | 
						|
	const (
 | 
						|
		eipSpecHash = "e3010170122029f2d17be6139079dc48696d1f582a8530eb9805b561eda517e22a892c7e3f1f"
 | 
						|
		eipHash     = "29f2d17be6139079dc48696d1f582a8530eb9805b561eda517e22a892c7e3f1f"
 | 
						|
		dagPb       = 0x70
 | 
						|
		sha2256     = 0x12
 | 
						|
	)
 | 
						|
	b, err := hex.DecodeString(eipSpecHash)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
	hashBytes, err := hex.DecodeString(eipHash)
 | 
						|
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	storageNs, contentType, hashType, hashLength, decodedHashBytes, err := decodeEIP1577ContentHash(b)
 | 
						|
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
	if storageNs != nsIpfs {
 | 
						|
		t.Fatal("wrong ns")
 | 
						|
	}
 | 
						|
	if contentType != dagPb {
 | 
						|
		t.Fatal("should be ipfs typecode")
 | 
						|
	}
 | 
						|
	if hashType != sha2256 {
 | 
						|
		t.Fatal("should be sha2-256")
 | 
						|
	}
 | 
						|
	if hashLength != 32 {
 | 
						|
		t.Fatal("should be 32")
 | 
						|
	}
 | 
						|
	if !bytes.Equal(hashBytes, decodedHashBytes) {
 | 
						|
		t.Fatal("should be equal")
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
func TestManualCidDecode(t *testing.T) {
 | 
						|
	// call cid encode method with hash. expect byte slice returned, compare according to spec
 | 
						|
 | 
						|
	for _, v := range []struct {
 | 
						|
		name        string
 | 
						|
		headerBytes []byte
 | 
						|
		wantErr     bool
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			name:        "values correct, should not fail",
 | 
						|
			headerBytes: []byte{0xe4, 0x01, 0xfa, 0x1b, 0x20},
 | 
						|
			wantErr:     false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:        "cid version wrong, should fail",
 | 
						|
			headerBytes: []byte{0xe4, 0x00, 0xfa, 0x1b, 0x20},
 | 
						|
			wantErr:     true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:        "hash length wrong, should fail",
 | 
						|
			headerBytes: []byte{0xe4, 0x01, 0xfa, 0x1b, 0x1f},
 | 
						|
			wantErr:     true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:        "values correct for ipfs, should fail",
 | 
						|
			headerBytes: []byte{0xe3, 0x01, 0x70, 0x12, 0x20},
 | 
						|
			wantErr:     true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:        "loose values for swarm, todo remove, should not fail",
 | 
						|
			headerBytes: []byte{0xe4, 0x01, 0x70, 0x12, 0x20},
 | 
						|
			wantErr:     false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:        "loose values for swarm, todo remove, should not fail",
 | 
						|
			headerBytes: []byte{0xe4, 0x01, 0x99, 0x99, 0x20},
 | 
						|
			wantErr:     false,
 | 
						|
		},
 | 
						|
	} {
 | 
						|
		t.Run(v.name, func(t *testing.T) {
 | 
						|
			const eipHash = "29f2d17be6139079dc48696d1f582a8530eb9805b561eda517e22a892c7e3f1f"
 | 
						|
 | 
						|
			var bb []byte
 | 
						|
			buf := make([]byte, binary.MaxVarintLen64)
 | 
						|
			for _, vv := range v.headerBytes {
 | 
						|
				n := binary.PutUvarint(buf, uint64(vv))
 | 
						|
				bb = append(bb, buf[:n]...)
 | 
						|
			}
 | 
						|
 | 
						|
			h := common.HexToHash(eipHash)
 | 
						|
			bb = append(bb, h[:]...)
 | 
						|
			str := hex.EncodeToString(bb)
 | 
						|
			fmt.Println(str)
 | 
						|
			decodedHash, e := extractContentHash(bb)
 | 
						|
			switch v.wantErr {
 | 
						|
			case true:
 | 
						|
				if e == nil {
 | 
						|
					t.Fatal("the decode should fail")
 | 
						|
				}
 | 
						|
			case false:
 | 
						|
				if e != nil {
 | 
						|
					t.Fatalf("the deccode shouldnt fail: %v", e)
 | 
						|
				}
 | 
						|
				if !bytes.Equal(decodedHash[:], h[:]) {
 | 
						|
					t.Fatal("hashes not equal")
 | 
						|
				}
 | 
						|
			}
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestManuelCidEncode(t *testing.T) {
 | 
						|
	// call cid encode method with hash. expect byte slice returned, compare according to spec
 | 
						|
	const eipHash = "29f2d17be6139079dc48696d1f582a8530eb9805b561eda517e22a892c7e3f1f"
 | 
						|
	cidBytes, err := EncodeSwarmHash(common.HexToHash(eipHash))
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	// logic in extractContentHash is unit tested thoroughly
 | 
						|
	// hence we just check that the returned hash is equal
 | 
						|
	h, err := extractContentHash(cidBytes)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	if bytes.Equal(h[:], cidBytes) {
 | 
						|
		t.Fatal("should be equal")
 | 
						|
	}
 | 
						|
}
 |