You need good starting values:
#starting values from linearization
fit0 <- lm(log(y) ~ log(x1) + log(x2) +log(x3), data=dat)
# fit a nonlinear model
fm <- nls(y ~ f(x1,x2,x3,a,b1,b2,b3), data = dat,
start = list(a=exp(coefficients(fit0)[1]),
b1=coefficients(fit0)[2],
b2=coefficients(fit0)[3],
b3=coefficients(fit0)[4]))
summary(fm)
# Parameters:
# Estimate Std. Error t value Pr(>|t|)
# a 265.19567 114.37494 2.319 0.081257 .
# b1 0.97277 0.08186 11.884 0.000287 ***
# b2 0.97243 0.12754 7.624 0.001589 **
# b3 0.91938 0.17032 5.398 0.005700 **
The usual diagnostics recommended for non-linear models should follow.
Also note, that starting values are supplied to nls
as a list.