@ -3,11 +3,9 @@ package resolver
import (
import (
"encoding/binary"
"encoding/binary"
"fmt"
"fmt"
// "net/url"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/xeth"
)
)
/ *
/ *
@ -24,37 +22,40 @@ const (
)
)
type Resolver struct {
type Resolver struct {
xeth * xeth . XEth
backend Backend
urlHintContractAddress string
urlHintContractAddress string
nameRegContractAddress string
nameRegContractAddress string
}
}
func New ( _xeth * xeth . XEth , uhca , nrca string ) * Resolver {
type Backend interface {
return & Resolver { _xeth , uhca , nrca }
StorageAt ( string , string ) string
}
}
func ( self * Resolver ) NameToContentHash ( name string ) ( hash common . Hash , err error ) {
func New ( eth Backend , uhca , nrca string ) * Resolver {
return & Resolver { eth , uhca , nrca }
}
func ( self * Resolver ) NameToContentHash ( name string ) ( chash common . Hash , err error ) {
// look up in nameReg
// look up in nameReg
hashbytes := self . xeth . StorageAt ( self . nameRegContractAddress , storageAddress ( 0 , common . Hex2Bytes ( name ) ) )
key := storageAddress ( 0 , common . Hex2Bytes ( name ) )
copy ( hash [ : ] , hashbytes [ : 32 ] )
hash := self . backend . StorageAt ( self . nameRegContractAddress , key )
copy ( chash [ : ] , common . Hex2Bytes ( hash ) )
return
return
}
}
func ( self * Resolver ) ContentHashToUrl ( hash common . Hash ) ( uri string , err error ) {
func ( self * Resolver ) ContentHashToUrl ( c hash common . Hash ) ( uri string , err error ) {
// look up in nameReg
// look up in nameReg
key := storageAddress ( 0 , chash [ : ] )
urlHex := self . xeth . StorageAt ( self . urlHintContractAddress , storageAddress ( 0 , hash . Bytes ( ) ) )
uri = self . backend . StorageAt ( self . urlHintContractAddress , key )
uri = string ( common . Hex2Bytes ( urlHex ) )
l := len ( uri )
l := len ( uri )
for ( l > 0 ) && ( uri [ l - 1 ] == 0 ) {
for ( l > 0 ) && ( uri [ l - 1 ] == 0 ) {
l --
l --
}
}
uri = uri [ : l ]
uri = uri [ : l ]
if l == 0 {
if l == 0 {
err = fmt . Errorf ( "GetURLhint: URL hint not found" )
err = fmt . Errorf ( "GetURLhint: URL hint not found" )
}
}
// rawurl := fmt.Sprintf("bzz://%x/my/path/mycontract.s ud", hash[:])
// mime type?
return
return
}
}